- ベストアンサー
BufferedImageへの変換エラーです
- BufferedImageに変換したいんですが、引数の取り方が分かりません。
- "srcimage1"を"BufferedImage"、"Image"で取ってやっても"BufferedImageにキャスト出来ません"という意味のエラー表示が出るばかりでお手上げです。
- エラーの原因についてどうか宜しくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#2さんへ 返信、ありがとうございます。 簡単なサンプルを使って実験してみました。 (A) public class AppletTest extends Applet { BufferedImage image; @Override public void init() { try { URL url = new URL(this.getCodeBase().toString() + "test.JPG"); image = ImageIO.read(url); } catch (MalformedURLException ex) { System.err.println(ex); } catch (IOException ex) { System.err.println(ex); } } @Override public void paint(Graphics g) { super.paint(g); g.drawImage(image, 0, 0, this); } } (B) public class AppletTest extends Applet { BufferedImage image; @Override public void init() { try { File url = new File(this.getCodeBase().getPath() + "test.JPG"); image = ImageIO.read(url); } catch (IOException ex) { System.err.println(ex); } } @Override public void paint(Graphics g) { super.paint(g); g.drawImage(image, 0, 0, this); } } (A)は、 1.ファイルが自分のハードディスク内にありアプレットビューアーで実行。 成功 2.ファイルがWebサーバー中にあり、ブラウザで実行。 成功 ですが、(B)は、 1.ファイルが自分のハードディスク内にありアプレットビューアーで実行。 成功 2.ファイルがWebサーバー中にあり、ブラウザで実行。 失敗 でした。 やはり、Fileクラスを使うのは、問題が残るのではないでしょうか?
その他の回答 (6)
- covachan
- ベストアンサー率38% (46/120)
#6さん あ、すみません。 ウェブ上ということだったのですね。 私はローカルファイルでしか試していません。 ローカルの画像を読み込む感じです。 そもそも、どこの画像を使うかなんて 質問にないですし、処理の書き方の問題ですので そこで意見を言われても正直参りますし、意味はないでしょう?
- covachan
- ベストアンサー率38% (46/120)
>>#4さんへ 確かにソースの書き方に問題はありましたが、 変更はしたものの、Fileでも動きますよ。 java docにもありますので問題はないと思いますが、 使い方的にということでしょうか? 参考に動作させてみたソース載せますので、 主さんも参考までに確認をしてみてください。 public void init() { this.setLocation( 0 , 0 ) ; setBackground( Color.red ) ; try{ g2 = (Graphics2D)g ; URL url = getCodeBase(); BufferedImage bi = ImageIO.read(new File(url.getPath()+"/a.gif")); newimg = change(bi, new BufferedImage(100 , 100 , BufferedImage.TYPE_4BYTE_ABGR_PRE)); }catch(Exception e){ e.printStackTrace(); } } public void paint(Graphics g) { g.drawImage(newimg , 0 , 0 , null ) ; } public BufferedImage change(BufferedImage source , BufferedImage target) { //this.source = source ; this.target = target ; Graphics2D g2 = target.createGraphics() ; g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION ,RenderingHints.VALUE_INTERPOLATION_BICUBIC) ; double scalex = (double) target.getWidth() / source.getWidth() ; double scaley = (double) target.getHeight() / source.getHeight() ; AffineTransform xform = AffineTransform.getScaleInstance(scalex , scaley) ; g2.drawRenderedImage(source , xform) ; g2.dispose() ; return target ; }
- PecoPlus
- ベストアンサー率76% (144/188)
こんにちは。 #2さんへ Fileクラスではなく、URLクラスを使わないと、ウェブサーバーに上げたときに、うまくいかないのでは? BufferedImage bi = ImageIO.read(new File(getCodeBase()+ "a.gif")); ↓ BufferedImage bi = ImageIO.read(new URL(getCodeBase().toString() + "a.gif"));
- covachan
- ベストアンサー率38% (46/120)
何でもかんでも投げるのはやめてください。 動作確認はできましたので最後のコメントを(狙いの動きかどうかはわかりませんが) エラーについてですが、画像はちゃんと読み込めてますか? パスを間違えていませんか? あと、 g2 = (Graphics2D)g ; の目的がわかりません。 以下の記述で画像は表示されました。 g.drawImage(newimg , 0 , 0 , null ) ; 後はご自分でがんばってください。
- covachan
- ベストアンサー率38% (46/120)
何をされたいのかわからないのでわかる範囲ですが、 srcimage0 = getImage( getDocumentBase() , "a.gif" ) ; srcimage1 = ( BufferedImage )srcimage0 ; newimg = change(srcimage1 , new BufferedImage(100 , 100 , BufferedImage.TYPE_4BYTE_ABGR_PRE)); は BufferedImage bi = ImageIO.read(new File(getCodeBase()+ "a.gif")); newimg = change(bi, new BufferedImage(100 , 100 , BufferedImage.TYPE_4BYTE_ABGR_PRE)); みたいな感じでは無理ですか?
- covachan
- ベストアンサー率38% (46/120)
確認しましたが、何かいろいろと問題がありますね。 主さんのスキルでは問題解決は難しいと思いますが、 今回のポイントだけ書くと、 srcimage0 = getImage( getDocumentBase() , "a.gif" ) ; で取得できるオブジェクトの実体は私が確認した限り、 ToolkitImageでした。 ToolkitImageはImagaeのサブクラスですので、 同じImagaeのサブクラスであるBufferedImageへのキャストで失敗します。 で、どうすればいいかというと、そのままToolkitImageでコードを組み立てるか、 ToolkitImageからBufferedImageを再生成するしか現在のコードに合わせられないでしょう。
お礼
>で、どうすればいいかというと、そのままToolkitImageでコードを組み立てるか、 >ToolkitImageからBufferedImageを再生成するしか現在のコードに合わせられないでしょう。 他の参考書を探してみましたが、よくわかりませんでした。 何とか教えて頂けないでしょうか。 宜しくお願いします。
お礼
回答有難うございます。 下のように書き換えてやりましたが、 //Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException //at BufferedImage1.paint(BufferedImage1.java:47) のようなエラーコメントが出て、 「newimg = change( bi , new BufferedImage( 100 ,100 ,BufferedImage.TYPE_4BYTE_ABGR_PRE ) ) ;」 の箇所で newimg がNULL値をとっています。 どこが悪いのでしょうか、宜しくお願いします。 ====================================================================== public class BufferedImage1 extends Applet { static BufferedImage srcimage1 , newimg ; static Image srcimage0 ; static BufferedImage source ; static BufferedImage target ; static Graphics g ; static Graphics2D g2 ; static Image img ; public void init() { this.setLocation( 0 , 0 ) ; setBackground( Color.red ) ; g2 = (Graphics2D)g ; // srcimage0 = Toolkit.getDefaultToolkit().getImage("a.gif"); // srcimage1 = ( BufferedImage )srcimage0 ; // newimg = change(srcimage1 , new BufferedImage(100 , 100 , BufferedImage.TYPE_4BYTE_ABGR_PRE)) ; try { BufferedImage bi = ImageIO.read( new File(getCodeBase() + "a.gif" ) ) ; newimg = change( bi , new BufferedImage( 100 , 100 , BufferedImage.TYPE_4BYTE_ABGR_PRE ) ) ; } catch(Exception e){} } public void paint(Graphics g) { g2.drawImage(newimg , 0 , 0 , null ) ; } public BufferedImage change( BufferedImage source , BufferedImage target) { this.source = source ; this.target = target ; Graphics2D g2 = target.createGraphics() ; g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION , RenderingHints.VALUE_INTERPOLATION_BICUBIC) ; double scalex = (double) target.getWidth() / source.getWidth() ; double scaley = (double) target.getHeight() / source.getHeight() ; AffineTransform xform = AffineTransform.getScaleInstance(scalex , scaley) ; g2.drawRenderedImage(source , xform) ; g2.dispose() ; return target ; } }