Java 加载并调整图像大小

Java 加载并调整图像大小,java,image,swing,graphics,Java,Image,Swing,Graphics,我正在Java Swing中加载一个图像,并希望在JPanel中显示它。我面临的问题是,尽管加载了图像,但它没有在JPanel中显示。我可以说,该图像已成功加载,因为它在我的标签中显示了加载图像的正确路径 这是我的密码 private static final int IMG_WIDTH = 120; private static final int IMG_HEIGHT = 120; JLabel label; ImageIcon photo; WritableRaster raster; D

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

这是我的密码

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;
}

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

然后尝试使用

试试看{
BuffereImage originalImage=ImageIO.read(图像);
int type=originalImage.getType()=0?BufferedImage.type_int_ARGB:originalImage.getType();
BuffereImage resizeImageJpg=resizeImage(原始图像,类型);
//忘记toImage()方法吧,BuffereImage已经扩展了Image类。
照片=新图像图标(resizeImageJpg);
//顺便说一句,如果删除组件并添加新组件,请改用validate()。
//不要移除JLabel,只需更改图标,它将自动重新绘制。
标签.设置图标(照片);
}
catch(java.io.IOException-IOException){
System.out.println(e.getMessage());
}
对于调整大小的BuffereImage,使用AffineTransform将图像缩放到新大小

private static BufferedImage resizeImage(BufferedImage originalImage,int类型){
BuffereImage resizedImage=新的BuffereImage(图像宽度、图像高度、类型);
//计算除垢率;
双刻度DX=((IMG_WIDTH*1.0d)/originalImage.getWidth());
双刻度涡=((IMG_HEIGHT*1.0d)/originalImage.getHeight());
AffineTransform resizeAffine=AffineTransform.getScaleInstance(ScaleDx,ScaleDx);
BuffereImage Op buffResized=新仿射Transformop(resizeAffine,null);
Graphics2D g2=resizedImage.createGraphics();
g2.drawImage(大小调整图像,大小调整为0,0);
g2.dispose();//不要忘记dispose以释放资源。
}

我希望我能提供帮助。

尝试label.setVisible(true)如果没有,您可能需要将布局添加到面板或为label设置边界。1)要更快获得更好的帮助,请发布一个(最小完整且可验证的示例)。2) 例如,获取图像的一种方法是热链接到中看到的图像。
jPanel2.removeAll()
使用
CardLayout
或在启动时向其添加一个标签,然后使用新的(已调整大小的)图像调用
setIcon
。查看有关在SwingUnless中调整图像大小的技术的讨论,您确实需要,尽量避免创建新的
JLabel
,而是使用它的
setIcon
属性。。。