アプリ版:「スタンプのみでお礼する」機能のリリースについて

 こんにちは。java初心者です、宜しくお願いします。

 BufferedImageに変換したいんですが、引数の取り方が分かりません。

 "srcimage1"を"BufferedImage" 、"Image"で取ってやっても"BufferedImageにキャスト出来ま
せん"という意味のエラー表示が出るばかりでお手上げです。
 
 どなたか詳しい方、エラーの原因についてどうか宜しくお願いします。

=========================================
public class BufferedImage1 extends Applet
{
static BufferedImage srcimage1 , newimg ;
static Image srcimage0 ;
//static BufferedImage 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 = getImage( getDocumentBase() , "a.gif" ) ;
srcimage1 = ( BufferedImage )srcimage0 ;
newimg = change(srcimage1 , new BufferedImage(100 , 100 ,

BufferedImage.TYPE_4BYTE_ABGR_PRE)) ;
}

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

A 回答 (7件)

#6さん



あ、すみません。
ウェブ上ということだったのですね。

私はローカルファイルでしか試していません。
ローカルの画像を読み込む感じです。

そもそも、どこの画像を使うかなんて
質問にないですし、処理の書き方の問題ですので
そこで意見を言われても正直参りますし、意味はないでしょう?
    • good
    • 0

 #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クラスを使うのは、問題が残るのではないでしょうか?
    • good
    • 0

>>#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 ;
}
    • good
    • 0

 こんにちは。



 #2さんへ

 Fileクラスではなく、URLクラスを使わないと、ウェブサーバーに上げたときに、うまくいかないのでは?

BufferedImage bi = ImageIO.read(new File(getCodeBase()+ "a.gif"));

    ↓

BufferedImage bi = ImageIO.read(new URL(getCodeBase().toString() + "a.gif"));
    • good
    • 0

何でもかんでも投げるのはやめてください。



動作確認はできましたので最後のコメントを(狙いの動きかどうかはわかりませんが)

エラーについてですが、画像はちゃんと読み込めてますか?
パスを間違えていませんか?

あと、
g2 = (Graphics2D)g ;
の目的がわかりません。

以下の記述で画像は表示されました。

g.drawImage(newimg , 0 , 0 , null ) ;

後はご自分でがんばってください。
    • good
    • 0

何をされたいのかわからないのでわかる範囲ですが、




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

みたいな感じでは無理ですか?
    • good
    • 0
この回答へのお礼

 回答有難うございます。
 下のように書き換えてやりましたが、

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

お礼日時:2012/11/03 12:00

確認しましたが、何かいろいろと問題がありますね。


主さんのスキルでは問題解決は難しいと思いますが、
今回のポイントだけ書くと、


srcimage0 = getImage( getDocumentBase() , "a.gif" ) ;

で取得できるオブジェクトの実体は私が確認した限り、
ToolkitImageでした。
ToolkitImageはImagaeのサブクラスですので、
同じImagaeのサブクラスであるBufferedImageへのキャストで失敗します。

で、どうすればいいかというと、そのままToolkitImageでコードを組み立てるか、
ToolkitImageからBufferedImageを再生成するしか現在のコードに合わせられないでしょう。
    • good
    • 0
この回答へのお礼

>で、どうすればいいかというと、そのままToolkitImageでコードを組み立てるか、
>ToolkitImageからBufferedImageを再生成するしか現在のコードに合わせられないでしょう。

他の参考書を探してみましたが、よくわかりませんでした。
何とか教えて頂けないでしょうか。
宜しくお願いします。

お礼日時:2012/11/02 11:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!