Страница 1 из 1

изменить размер imageIcon

Добавлено: 26 июн 2006, 16:55
michael
есть Jlabel с ImageIcon. У ImageIcon есть метод getIconHeight, но нету ыetIconHeight.
Как задать размер ImageIcon-у.
Спасибо

Добавлено: 26 июн 2006, 19:04
Oscar
мда, эта задачка посложней будет ..

Задать размер нельзя никак.
Можно создать копию Image_а с новыми размерами.

Есть две проблемы:
1. получить картинку
2. resize_нуть её

Первую я решил таким вот образом:

Код: Выделить всё

		URL imageURL = getClass().getResource("/test.jpg");
		ImageIcon imageIcon = new ImageIcon(imageURL);
		Image image = imageIcon.getImage();
		ToolkitImage toolkitImage = (ToolkitImage)image;
		BufferedImage bufferedImage = toolkitImage.getBufferedImage();
Наверное стоило бы проверять прямое кастование типов, но ну его
(не знаю, что делать, если картинка в иконке НЕ sun.awt.image.ToolkitImage ..)

и вторая - нашел где-то на SUNовском форуме:

Код: Выделить всё

	public static BufferedImage resizeImage(BufferedImage image, int width, int height) {
		
		ColorModel cm = image.getColorModel();
		
	    WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
	    
	    boolean isRasterPremultiplied = cm.isAlphaPremultiplied();
	    
	    BufferedImage target = new BufferedImage(cm, raster, isRasterPremultiplied, null);
	    Graphics2D g2 = target.createGraphics();
	    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
	    
	    double scalex = (double) target.getWidth()/ image.getWidth();
	    double scaley = (double) target.getHeight()/ image.getHeight();
	    
	    AffineTransform xform = AffineTransform.getScaleInstance(scalex, scaley);
	    g2.drawRenderedImage(image, xform);
	    g2.dispose();
	    return target;
	}
Ну, в общем, у меня работает.
Вот полный код:

Код: Выделить всё

import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.WritableRaster;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import sun.awt.image.ToolkitImage;

public class ChangeIconSize {

	public ChangeIconSize() {
		
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel panel = new JPanel();
		panel.setLayout(null);
		
		init(panel);
		
		frame.add(panel);
		
		frame.setSize(800, 600);
		frame.setVisible(true);
		
	}
	
	private void init(JPanel panel) {
				
		URL imageURL = getClass().getResource("/test.jpg");
		
		ImageIcon imageIcon = new ImageIcon(imageURL);
		
		JLabel l1 = new JLabel(imageIcon);
		l1.setBounds(0, 0, 400, 300);
		panel.add(l1);
		
		Image image = imageIcon.getImage();
		ToolkitImage toolkitImage = (ToolkitImage)image;
		BufferedImage bufferedImage = toolkitImage.getBufferedImage();		
		BufferedImage resizedImage = resizeImage(bufferedImage, bufferedImage.getWidth()/2, bufferedImage.getHeight()/2);
		
		ImageIcon imageIcon2 = new ImageIcon(resizedImage);
		
		JLabel l2 = new JLabel(imageIcon2);
		l2.setBounds(400, 0, 400, 300);
		panel.add(l2);
		
	}
	
	public static BufferedImage resizeImage(BufferedImage image, int width, int height) {
		
		ColorModel cm = image.getColorModel();
		
	    WritableRaster raster = cm.createCompatibleWritableRaster(width, height);
	    
	    boolean isRasterPremultiplied = cm.isAlphaPremultiplied();
	    
	    BufferedImage target = new BufferedImage(cm, raster, isRasterPremultiplied, null);
	    Graphics2D g2 = target.createGraphics();
	    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
	    
	    double scalex = (double) target.getWidth()/ image.getWidth();
	    double scaley = (double) target.getHeight()/ image.getHeight();
	    
	    AffineTransform xform = AffineTransform.getScaleInstance(scalex, scaley);
	    g2.drawRenderedImage(image, xform);
	    g2.dispose();
	    return target;
	}
	
	public static void main(String[] args) {
		new ChangeIconSize();
	}

}

Добавлено: 26 июн 2006, 20:33
michael
Готов облобызать ваши стопы :)