2011-11-27 40 views
5

Tôi có đoạn mã mà tôi đang sử dụng cho mục đích thay đổi kích thước hình ảnh thành kích thước màn hình (Tôi muốn thay đổi độ phân giải thành 200 dpi). Về cơ bản lý do tôi cần nó là vì tôi muốn hiển thị hình ảnh mà người dùng đã chọn (hơi lớn) và sau đó nếu người dùng chấp thuận tôi muốn hiển thị cùng một hình ảnh ở một nơi khác nhưng sử dụng độ phân giải nhỏ hơn. Thật không may, nếu tôi cho nó một hình ảnh lớn không có gì xuất hiện trên màn hình. Ngoài ra, nếu tôi thay đổiThay đổi kích thước hình ảnh trong xoay

imageLabel.setIcon(newIcon); 

để

imageLabel.setIcon(icon); 

tôi nhận được hình ảnh để hiển thị nhưng không phải trong việc giải quyết đúng đắn đó là cách tôi biết rằng tôi có một vấn đề bên trong thợ mã này và không ở một nơi khác .

Image img = icon.getImage(); 

BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
BufferedImage bi = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
Graphics g = bi.createGraphics(); 
boolean myBool = g.drawImage(img, 0, 0, 100, 100, null); 
System.out.println(myBool); 
ImageIcon newIcon = new ImageIcon(bi); 
imageLabel.setIcon(newIcon); 
submitText.setText(currentImagePath); 
imageThirdPanel.add(imageLabel); 
+0

1) Bạn có câu hỏi không? 2) Lưu ý rằng mọi thứ cho tới 'ImageIcon newIcon = new ImageIcon (bi);' là AWT, chứ không phải Swing. 3) Đó là 'Swing', không phải 'swing' 4) Để tốt hơn giúp đỡ sớm hơn, đăng một [SSCCE] (http://sscce.org/) –

+0

Được rồi, tôi không hiển thị toàn bộ mã vì nó quá dài. Ngoài ra, tôi không chắc tại sao bạn nói nó là Swing và không đu (đó là wh Tôi nhận được từ tự động hoàn thành khi tôi nhập thẻ - Tôi không thấy đó là lỗi của tôi). Tôi nghĩ đó là SSCCE. Giống như tôi đã nói phần còn lại của các công trình mã Tôi chắc chắn có một vấn đề trong đoạn mã này. Có lẽ khi tôi vẽ hình ảnh, nhưng tôi không chắc chắn những gì. –

+0

* "Tôi nghĩ đó là SSCCE." * Bạn nghĩ sai. Vui lòng đọc tài liệu. –

Trả lời

6

Đây là giải pháp của tôi:

private BufferedImage resizeImage(BufferedImage originalImage, int width, int height, int type) throws IOException { 
     BufferedImage resizedImage = new BufferedImage(width, height, type); 
     Graphics2D g = resizedImage.createGraphics(); 
     g.drawImage(originalImage, 0, 0, width, height, null); 
     g.dispose(); 
     return resizedImage; 
    } 
1

thử mã này để thay đổi kích thước hình ảnh:

public static Image scaleImage(Image original, int newWidth, int newHeight) { 
    //do nothing if new and old resolutions are same 
    if (original.getWidth() == newWidth && original.getHeight() == newHeight) { 
     return original; 
    } 

    int[] rawInput = new int[original.getHeight() * original.getWidth()]; 
    original.getRGB(rawInput, 0, original.getWidth(), 0, 0, original.getWidth(), original.getHeight()); 
    int[] rawOutput = new int[newWidth * newHeight]; 
    // YD compensates for the x loop by subtracting the width back out 
    int YD = (original.getHeight()/newHeight) * original.getWidth() - original.getWidth(); 
    int YR = original.getHeight() % newHeight; 
    int XD = original.getWidth()/newWidth; 
    int XR = original.getWidth() % newWidth; 
    int outOffset = 0; 
    int inOffset = 0; 
    for (int y = newHeight, YE = 0; y > 0; y--) { 
     for (int x = newWidth, XE = 0; x > 0; x--) { 
      rawOutput[outOffset++] = rawInput[inOffset]; 
      inOffset += XD; 
      XE += XR; 
      if (XE >= newWidth) { 
       XE -= newWidth; 
       inOffset++; 
      } 
     } 
     inOffset += YD; 
     YE += YR; 
     if (YE >= newHeight) { 
      YE -= newHeight; 
      inOffset += original.getWidth(); 
     } 
    } 
    return Image.createRGBImage(rawOutput, newWidth, newHeight, false); 
} 
9

Bạn không thực sự phải quan tâm đến các chi tiết của hình ảnh rộng. Lớp Image đã có phương thức getScaledInstance(int width, int height, int hints) được thiết kế cho mục đích này. Tài liệu Java cho biết:

Tạo phiên bản thu nhỏ của hình ảnh này. Một đối tượng Hình ảnh mới được trả về sẽ hiển thị hình ảnh ở chiều rộng và chiều cao được chỉ định theo mặc định. Đối tượng Hình ảnh mới có thể được tải không đồng bộ ngay cả khi hình ảnh nguồn gốc đã được tải hoàn toàn. Nếu chiều rộng hoặc chiều cao là số âm thì giá trị được thay thế để duy trì tỷ lệ co của kích thước hình ảnh gốc.

Và bạn có thể sử dụng nó như thế này:

// Scale Down the original image fast 
Image scaledImage = imageToScale.getScaledInstance(newWidth, newHighth, Image.SCALE_FAST); 
// Repaint this component 
repaint(); 

Kiểm tra this cho một ví dụ hoàn chỉnh.

+0

Nếu cần một tỷ lệ tỷ lệ, hãy chuyển '-1' làm đối số cho phép đo phải theo phương pháp kia. Ví dụ, nếu bạn muốn mở rộng quy mô dựa trên chiều rộng, bạn sẽ gọi một cái gì đó như 'anImage.getScaledInstance (150, -1, java.awt.Image.SCALE_FAST) ' –

Các vấn đề liên quan