0

私はうまく動作する小さなプログラムを作成しました。その後、GUI を追加する必要があったため、NetBeans を使用してすべてのコードを移植し、作業を少し簡単にしました。jpgを使用するとうまく機能しますが、明らかにそれは使用するのに最適な形式ではありません. 以前は png を使用していたときは問題なく動作していましたが、今ではコンソールに大きなエラー リストが表示されるようになりました。基本的に、プログラムはユーザーが選択したファイルをバッファリングされたイメージとして読み取り、GUI のラベルを選択したファイルとして設定するか、GUI を作成するまでそれを行いました。私が言っているように、jpgで問題なく動作するので、問題はまったくないので、何が起こっているのかよくわかりません. また、ファイルパスと bufferedimage 変数をコンソールに出力するので、 bufferedimage の罰金としてそれを読み取るので、それらの両方が正常であることを確認できます。次に、次のようなエラーの大きなリストが表示されます。

スレッド「AWT-EventQueue-0」での例外 java.lang.ClassCastException: [java.awt.image.ColorModel で java.awt.image.ColorModel.getAlpha(ColorModel.java:833) で [B にキャストできません。 getRGB(ColorModel.java:878) で sun.awt.image.ImageRepresentation.convertToRGB(ImageRepresentation.java:305) で sun.awt.image.ImageRepresentation.setPixels(ImageRepresentation.java:564) で java.awt.image.AreaAveragingScaleFilter .accumPixels(AreaAveragingScaleFilter.java:213) at java.awt.image.AreaAveragingScaleFilter.setPixels(AreaAveragingScaleFilter.java:252) 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) で java.awt.image.FilteredImageSource.startProduction(FilteredImageSource.java:183) で sun.awt.image.ImageRepresentation.startProduction(ImageRepresentation.java:727) で sun.awt .image.ImageRepresentation.drawToBufImage(ImageRepresentation.java:802) で sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:1018) で、sun.java2d.pipe.ValidatePipe.copyImage(ValidatePipe.java:186) で。 java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3084) で sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:3069) で javax.swing.ImageIcon.paintIcon(ImageIcon.java:413) で sun.swing.plaf.synth .SynthIcon.paintIcon(SynthIcon.java:67) で javax.swing.plaf.synth.SynthGraphicsUtils.paintText(SynthGraphicsUtils.java:396) で javax.swing.plaf.synth.SynthLabelUI.paint(SynthLabelUI.java:213) で javax.swing.plaf.synth.SynthLabelUI.update(SynthLabelUI.java:177) で javax.swing.JComponent.paintComponent(JComponent.java:778) で javax.swing.JComponent で.paint(JComponent.java:1054) で javax.swing.JComponent.paintChildren(JComponent.java:887) で javax.swing.JComponent.paint(JComponent.java:1063) で javax.swing.JComponent.paintToOffscreen(JComponent. java:5221) で javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1512) で javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1443) で javax.swing.RepaintManager.paint(RepaintManager.java) :1236) で javax.swing.JComponent._paintImmediately(JComponent.java:5169) で javax.swing.JComponent.paintImmediately(JComponent.java:4980) で 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) javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:784) で javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:757) で javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:706) で javax. swing.RepaintManager.access$1000(RepaintManager.java:62) で javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1651) で java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) で java. awt.EventQueue.dispatchEventImpl(EventQueue.java:727) で java.awt.EventQueue.access$200(EventQueue.java:103) で java.awt.EventQueue$3.run(EventQueue.java:688) で java.awt.EventQueue$3.run(EventQueue.java:686) で java.security.AccessController.doPrivileged(ネイティブ メソッド) で java.security.ProtectionDomain$1.doIntersectionPrivilege で(ProtectionDomain.java:76) java.awt.EventQueue.dispatchEvent(EventQueue.java:697) で java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) で java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java: 161) java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)でawt.EventDispatchThread.run(EventDispatchThread.java:91)688) java.awt.EventQueue$3.run(EventQueue.java:686) で java.security.AccessController.doPrivileged(Native Method) で java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) で java.awt .EventQueue.dispatchEvent(EventQueue.java:697) で java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) で java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) で java.awt.EventDispatchThread.pumpEventsForHierarchy( EventDispatchThread.java:150) で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) で java.awt.EventDispatchThread.run(EventDispatchThread.java:91) で)688) java.awt.EventQueue$3.run(EventQueue.java:686) で java.security.AccessController.doPrivileged(Native Method) で java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) で java.awt .EventQueue.dispatchEvent(EventQueue.java:697) で java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) で java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) で java.awt.EventDispatchThread.pumpEventsForHierarchy( EventDispatchThread.java:150) で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) で java.awt.EventDispatchThread.run(EventDispatchThread.java:91) で)java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) の doPrivileged(ネイティブ メソッド) java.awt.EventQueue.dispatchEvent(EventQueue.java:697) の) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) で java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) で java.awt で.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) で java.awt.EventDispatchThread.run(EventDispatchThread.java:91)java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) の doPrivileged(ネイティブ メソッド) java.awt.EventQueue.dispatchEvent(EventQueue.java:697) の) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) で java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) で java.awt で.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) で java.awt.EventDispatchThread.run(EventDispatchThread.java:91)697) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) で java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) で java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) でawt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) で java.awt.EventDispatchThread.run(EventDispatchThread.java:91) で697) java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) で java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) で java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) でawt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) で java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) で java.awt.EventDispatchThread.run(EventDispatchThread.java:91) でjava.awt.EventDispatchThread.run(EventDispatchThread.java:91) の EventDispatchThread.pumpEvents(EventDispatchThread.java:138)java.awt.EventDispatchThread.run(EventDispatchThread.java:91) の EventDispatchThread.pumpEvents(EventDispatchThread.java:138)


アイコンをロードするための私のコードは次のとおりです。

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

4

2 に答える 2

1

コードのエラーではないようですので、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);

このコードは、.a の特殊な処理専用の別のパスに進みます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
于 2013-10-28T10:09:35.840 に答える
0

を にキャストしようとしているようint[]ですbyte[]

于 2013-10-28T04:13:45.110 に答える