2011-08-31 55 views
7

đây là mã của tôi"thay đổi kích thước hình ảnh java getScaledInstance

ImageIcon ii=new ImageIcon("/Users/tushar_chutani/Desktop/apple.jpg"); 
      Image image= ii.getImage().getScaledInstance(50, 50, Image.SCALE_SMOOTH); 

hình ảnh không được thu nhỏ lại những gì là sai với mã?

+1

Bạn gặp phải lỗi gì? Bạn có thực sự hiển thị ImageIcon gốc không? Làm thế nào để bạn biết là không mở rộng quy mô. Dựa trên hai dòng mã bạn đăng bạn không làm gì với hình ảnh. Đăng [SSCCE] của bạn (http://sscce.org) để minh họa sự cố. – camickr

+0

hình ảnh không hiển thị ... hình ảnh thay đổi thành màu trắng ... –

+1

Sau đó, có thể nó không đọc hình ảnh. Bạn đã không đăng SSCCE, vì vậy chúng tôi không thể làm gì khác cho bạn. – camickr

Trả lời

15

Vấn đề là Image.getScaledInstance() không trả lại một xong, hình ảnh thu nhỏ Nó để lại nhiều tác vụ mở rộng cho thời gian sau đó là khi sử dụng pixel hình ảnh.

Ví dụ: nếu bạn sử dụng hình ảnh được chia tỷ lệ trong cuộc gọi Graphics2D.drawImage() phương thức sẽ trả về false và tiếp tục vẽ không đồng bộ. Sau đó, bạn phải sử dụng thông số ImageObserver trong cuộc gọi Graphics2D.drawImage() để chờ hoàn thành việc chia tỷ lệ và bản vẽ.

Ví dụ sau cho thấy cách chia tỷ lệ hình ảnh đơn giản hơn mà không cần ImageObserver. Việc chia tỷ lệ được thực hiện bằng cách vẽ biểu tượng thành một BufferedImage thay thế.

import javax.swing.ImageIcon; 
import java.awt.image.BufferedImage; 
import java.awt.Image; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.io.File; 
import javax.imageio.ImageIO; 
import java.awt.RenderingHints; 

public class Tushar2 
{ 
     public void scaleImage() 
     { 
       try 
       { 
         ImageIcon ii = new ImageIcon("/tmp/apple.jpg"); 
         BufferedImage bi = new BufferedImage(50, 50, BufferedImage.TYPE_INT_RGB); 
         Graphics2D g2d = (Graphics2D)bi.createGraphics(); 
         g2d.addRenderingHints(new RenderingHints(RenderingHints.KEY_RENDERING, 
           RenderingHints.VALUE_RENDER_QUALITY)); 
         boolean b = g2d.drawImage(ii.getImage(), 0, 0, 50, 50, null); 
         System.out.println(b); 
         ImageIO.write(bi, "jpg", new File("/tmp/apple50.jpg")); 
       } 
       catch (Exception e) 
       { 
         e.printStackTrace(); 
       } 
     } 

     public static void main(String []args) 
     { 
       new Tushar2().scaleImage(); 
     } 
} 
2

Bạn có thể bọc lại hình ảnh trong biểu tượng hình ảnh. Biểu tượng hình ảnh thường tải hình ảnh trong hàm khởi tạo của nó và sử dụng trình theo dõi phương tiện của riêng mình cho mục đích này. Tôi hiện đang sử dụng mã sau đây:

 Image image = icon.getImage().getScaledInstance(
      icon.getIconWidth() * NEW/OLD, 
      icon.getIconHeight() * NEW/OLD, 
      Image.SCALE_SMOOTH); 
    icon = new ImageIcon(image, icon.getDescription()); 

Bạn có thể trực tiếp làm việc với biểu tượng mới hoặc gọi getImage() để làm việc với hình ảnh mới. Đoạn mã trên cũng thực hiện một tỷ lệ khung hình giữ nguyên tỷ lệ cho trên một số cặp NEW và OLD.

Tạm biệt

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