gpt4 book ai didi

java - 使用 .png 作为标签图标

转载 作者:行者123 更新时间:2023-12-01 13:55:54 24 4
gpt4 key购买 nike

我创建了一个运行良好的小程序,然后我需要添加一个 GUI,因此使用 NetBeans 移植了我的所有代码,以使事情变得更容易一些。当我使用 jpg 时,它工作得很好,但显然这不是最好的格式。以前,当我使用 png 时,它工作得很好,现在我在控制台中看到一大堆错误,这是我以前从未遇到过的。本质上,程序读取用户选择的文件作为缓冲图像,并将 GUI 中的标签设置为所选文件,或者直到创建 GUI 为止。正如我所说,它可以很好地处理 jpg,完全没有问题,所以我不太确定发生了什么。它也将其读取为 bufferedimage ,因为我将文件路径和 bufferedimage 变量打印到控制台,因此可以看到这两个都很好,然后是一大堆错误,如下所示:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: [I cannot be cast to [B at java.awt.image.ColorModel.getAlpha(ColorModel.java:833) at java.awt.image.ColorModel.getRGB(ColorModel.java:878) at sun.awt.image.ImageRepresentation.convertToRGB(ImageRepresentation.java:305) at sun.awt.image.ImageRepresentation.setPixels(ImageRepresentation.java:564) at java.awt.image.AreaAveragingScaleFilter.accumPixels(AreaAveragingScaleFilter.java:213) at java.awt.image.AreaAveragingScaleFilter.setPixels(AreaAveragingScaleFilter.java:252) at sun.awt.image.OffScreenImageSource.sendPixels(OffScreenImageSource.java:102) at sun.awt.image.OffScreenImageSource.produce(OffScreenImageSource.java:187) at sun.awt.image.OffScreenImageSource.addConsumer(OffScreenImageSource.java:66) at sun.awt.image.OffScreenImageSource.startProduction(OffScreenImageSource.java:80) at java.awt.image.FilteredImageSource.startProduction(FilteredImageSource.java:183) at sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:727) at sun.awt.image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:802) at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1018) at sun.java2d.pipe.ValidatePipe.copyImage(ValidatePipe.java:186) at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3084) at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3069) at javax.swing.ImageIcon.paintIcon(ImageIcon.java:413) at sun.swing.plaf.synth.SynthIcon.paintIcon(SynthIcon.java:67) at javax.swing.plaf.synth.SynthGraphicsUtils.paintText(SynthGraphicsUtils.java:396) at javax.swing.plaf.synth.SynthLabelUI.paint(SynthLabelUI.java:213) at javax.swing.plaf.synth.SynthLabelUI.update(SynthLabelUI.java:177) at javax.swing.JComponent.paintComponent(JComponent.java:778) at javax.swing.JComponent.paint(JComponent.java:1054) at javax.swing.JComponent.paintChildren(JComponent.java:887) at javax.swing.JComponent.paint(JComponent.java:1063) at javax.swing.JComponent.paintToOffscreen(JComponent.java:5221) at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1512) at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1443) at javax.swing.RepaintManager.paint(RepaintManager.java:1236) at javax.swing.JComponent._paintImmediately(JComponent.java:5169) at javax.swing.JComponent.paintImmediately(JComponent.java:4980) at javax.swing.RepaintManager$3.run(RepaintManager.java:796) at javax.swing.RepaintManager$3.run(RepaintManager.java:784) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784) at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757) at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706) at javax.swing.RepaintManager.access$1000(RepaintManager.java:62) at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1651) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:688) at java.awt.EventQueue$3.run(EventQueue.java:686) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:697) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

<小时/>

我的加载图标的代码是:

image1 = ImageIO.read(file);            
ImageIcon imageIcon1 = new ImageIcon(image1);
Image redInput = imageIcon1.getImage().getScaledInstance(300, 300, Image.SCALE_SMOOTH);
imageIcon1.setImage(redInput);
redLabel.setIcon(imageIcon1);

我只有 1 个名为 NewJFrame 的类,任何帮助将不胜感激!

最佳答案

由于您的代码中似乎没有错误,因此我建议尝试解决此问题,因为您无法更改 AWT 实现。

BufferedImage img=ImageIO.read(file);
Image redInput=new AffineTransformOp(
AffineTransform.getScaleInstance(300.0/img.getWidth(), 300.0/img.getHeight()),
AffineTransformOp.TYPE_BICUBIC).filter(img, null);
imageIcon1= new ImageIcon(redInput, file.toString());
redLabel.setIcon(imageIcon1);

此代码转到专用于 BufferedImage 专门处理的不同路径。不能保证这不会遇到相同的错误(因为我没有你的文件来测试它)。但我认为,值得一试,因为对代码的更改相当小。

如果这不起作用,您可以尝试在加载后立即按照其他人的建议手动转换颜色空间:

BufferedImage img=ImageIO.read(file);
final int w = img.getWidth(), h = img.getHeight();
BufferedImage bi=new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
bi.setRGB(0, 0, w, h, img.getRGB(0, 0, w, h, null, 0, w), 0, w);
img=bi;
// proceed as normally

关于java - 使用 .png 作为标签图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19627089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com