加载并调整图像大小 [英] Load and Resize Image

查看:96
本文介绍了加载并调整图像大小的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Java Swing中加载图像,并希望在JPanel中显示它。我面临的问题是,尽管加载了图像,但它并未显示在JPanel中。我可以说图像已成功加载,因为它显示了我的标签中加载图像的正确路径。



这是我的代码。

  private static final int IMG_WIDTH = 120; 
private static final int IMG_HEIGHT = 120;
JLabel标签;
ImageIcon照片;
WritableRaster栅格;
DataBufferByte数据;
档案影像;

JFileChooser选择器;
FileNameExtensionFilter过滤器;
chooser = new JFileChooser();
chooser.setCurrentDirectory(image);
filter = new FileNameExtensionFilter(jpeg,gif和png文件,jpg,gif,png);
chooser.addChoosableFileFilter(filter);

int i = chooser.showOpenDialog(this);
if(i == JFileChooser.APPROVE_OPTION){
image = chooser.getSelectedFile();
jLabel8.setText(image.getAbsolutePath());
尝试{
BufferedImage originalImage = ImageIO.read(image);
int type = originalImage.getType()== 0? BufferedImage.TYPE_INT_ARGB:originalImage.getType();
BufferedImage resizeImageJpg = resizeImage(originalImage,type);
photo = new ImageIcon(toImage(resizeImageJpg));
jPanel2.removeAll();
label = new JLabel(,photo,JLabel.CENTER);
label.setIcon(photo);
jPanel2.add(label);
setVisible(true);
//将缓存的图像转换为字节数组
raster = resizeImageJpg.getRaster();
data =(DataBufferByte)raster.getDataBuffer();

} catch(IOException e){
System.out.println(e.getMessage());
}

repaint();
chooser.setCurrentDirectory(image);
}

public Image toImage(BufferedImage bufferedImage){
return Toolkit.getDefaultToolkit()。createImage(bufferedImage.getSource());


$ b private static BufferedImage resizeImage(BufferedImage originalImage,int type){
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH,IMG_HEIGHT,type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage,0,0,IMG_WIDTH,IMG_HEIGHT,null);
g.dispose();

return resizedImage;
}


解决方案

首先,忘记 toImage()方法, BufferedImage 已经扩展了 Image 类。

然后尝试使用

 尝试{
BufferedImage originalImage = ImageIO.read(image);
int type = originalImage.getType()== 0? BufferedImage.TYPE_INT_ARGB:originalImage.getType();
BufferedImage resizeImageJpg = resizeImage(originalImage,type);

//忘记toImage()方法,BufferedImage已经扩展了Image类。
photo = new ImageIcon(resizeImageJpg);
//顺便说一句,如果删除组件并添加新组件,请改用validate()。

//不要删除JLabel,只需更改图标,它会自动重绘。
label.setIcon(photo);
}
catch(java.io.IOException iOException){
System.out.println(e.getMessage());
}

对于调整大小的BufferedImage,使用AffineTransform将图像缩放到新大小。

private static BufferedImage resizeImage(BufferedImage originalImage,int type){
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH,IMG_HEIGHT,type);

//计算比例缩放比例;
double scaledDx =((IMG_WIDTH * 1.0d)/originalImage.getWidth());
double scaledDy =((IMG_HEIGHT * 1.0d)/originalImage.getHeight());

AffineTransform resizeAffine = AffineTransform.getScaleInstance(scaledDx,scaledDy);
BufferedImageOp buffResized = new AffineTransformOp(resizeAffine,null);

Graphics2D g2 = resizedImage.createGraphics();
g2.drawImage(resizedImage,buffResized,0,0);
g2.dispose(); //不要忘记处置以释放资源。
}

我希望我能帮上忙。


I am loading an image in Java Swing and want to display it in JPanel..The problem I am facing is that despite of image being loaded, it is not showing in JPanel..I can say that image is successfully loaded because it is showing me the correct path of the loaded image in my label..

Here is my code..

private static final int IMG_WIDTH = 120;
private static final int IMG_HEIGHT = 120;
JLabel label;
ImageIcon photo;
WritableRaster raster;
DataBufferByte data;
File image;

JFileChooser chooser;
FileNameExtensionFilter filter;
chooser = new JFileChooser();
chooser.setCurrentDirectory(image);
filter = new FileNameExtensionFilter("jpeg, gif and png files", "jpg", "gif", "png");
chooser.addChoosableFileFilter(filter);

int i = chooser.showOpenDialog(this);
if (i == JFileChooser.APPROVE_OPTION) {
    image = chooser.getSelectedFile();
    jLabel8.setText(image.getAbsolutePath());
    try {
        BufferedImage originalImage = ImageIO.read(image);
        int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
        BufferedImage resizeImageJpg = resizeImage(originalImage, type);
        photo = new ImageIcon(toImage(resizeImageJpg));
        jPanel2.removeAll();
        label = new JLabel("", photo, JLabel.CENTER);
        label.setIcon(photo);
        jPanel2.add(label);
        setVisible(true);
            //converting buffered image to byte array
        raster = resizeImageJpg.getRaster();
        data = (DataBufferByte) raster.getDataBuffer();

     } catch (IOException e) {
            System.out.println(e.getMessage());
        }

        repaint();
        chooser.setCurrentDirectory(image);
    }

  public Image toImage(BufferedImage bufferedImage) {
    return Toolkit.getDefaultToolkit().createImage(bufferedImage.getSource());
}


private static BufferedImage resizeImage(BufferedImage originalImage, int type) {
    BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
    Graphics2D g = resizedImage.createGraphics();
    g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
    g.dispose();

    return resizedImage;
}

解决方案

First, forget the toImage() method, BufferedImage already extends the Image class.

Then try to use

    try {
        BufferedImage originalImage = ImageIO.read( image );
        int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
        BufferedImage resizeImageJpg = resizeImage( originalImage, type );

        //forget the toImage() method, BufferedImage already extends the Image class.
        photo = new ImageIcon( resizeImageJpg );
        //And by the way, if you remove components and add new ones, use validate() instead.

        //And don't remove the JLabel, just change the icon, it will repaint automatically.
        label.setIcon(photo);
    }
    catch ( java.io.IOException iOException ) { 
        System.out.println(e.getMessage());
    }

And for the resized BufferedImage, use AffineTransform to scale the image to the new size.

private static BufferedImage resizeImage(BufferedImage originalImage, int type) {
    BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);

    //Calculate de scale ratio;
    double scaledDx = ((IMG_WIDTH*1.0d)/originalImage.getWidth());
    double scaledDy = ((IMG_HEIGHT*1.0d)/originalImage.getHeight());

    AffineTransform resizeAffine = AffineTransform.getScaleInstance( scaledDx, scaledDy );
    BufferedImageOp buffResized = new AffineTransformOp( resizeAffine, null );

    Graphics2D g2 = resizedImage.createGraphics();
    g2.drawImage( resizedImage, buffResized, 0, 0 );
    g2.dispose(); //Don't forget to dispose to release resources.
}

I hope I could help.

这篇关于加载并调整图像大小的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆