Java 加载并调整图像大小
我正在Java Swing中加载一个图像,并希望在JPanel中显示它。我面临的问题是,尽管加载了图像,但它没有在JPanel中显示。我可以说,该图像已成功加载,因为它在我的标签中显示了加载图像的正确路径 这是我的密码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
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
属性。。。