JavaでGIF画像を100×100に縮小するよい方法を教えて下さい。

ネットで検索して色々試してみたのですが、どの方法でも
なぜか大半の画像が白黒2色になってしまいます。
一部の画像はカラーのまま縮小されるのですが、画質に問題があります。
よろしくお願いいたします。

回答の条件
  • 1人3回まで
  • 登録:2008/02/10 15:17:51
  • 終了:2008/02/12 00:33:56

ベストアンサー

id:mono-hate No.3

mono-hate回答回数4ベストアンサー獲得回数12008/02/11 01:39:55

ポイント80pt

Java 2D - adding Transparency

上のサイトにいくつか方法があります.

一番簡単な方法は,一つ前に投稿したcopyメソッドの第2引数を次のように変更します.

copy(image, GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
                .getDefaultConfiguration().createCompatibleImage(100, 100, Transparency.BITMASK))
id:hedachi

お教え頂いた方法でうまくいきました!

英語なので敬遠してしまいましたが、リンク先のページも後でしっかり拝読しようと思います。

とっても助かりました。ありがとうございます!

2008/02/12 00:32:22

その他の回答(2件)

id:wnagata No.1

wnagata回答回数170ベストアンサー獲得回数182008/02/10 21:09:33

ポイント10pt

java.awt.ImageのgetScaledInstanceメソッドを使用してみたらいかがでしょうか。

http://www.groovy-number.com/java/sample/ImageCopy.html

id:hedachi

ご回答ありがとうございます。

その方法は試してみたんですがダメでした。

ただ、ひょっとしたらその先の処理がマズいのかも知れません。

画像の加工とかって全くやったことがないので、

とんちんかんなことをやってるような気がします。


java.awt.Image si = bufferedImage.getScaledInstance( width , height , java.awt.Image.SCALE_SMOOTH );

BufferedImage shrinkImage = new BufferedImage( width , height , bufferedImage.getType() );

shrinkImage.createGraphics().drawImage(si, 0, 0, width, height, null);

ImageIO.write( shrinkImage, 拡張子, new File( "画像名" ) );


単にImageオブジェクトをファイルに出力する方法も

良く分からなくて困ってます。

2008/02/10 22:31:05
id:mono-hate No.2

mono-hate回答回数4ベストアンサー獲得回数12008/02/10 23:09:01

ポイント80pt

「Java SE 6完全攻略」第13回 GIFファイルの書き出し:ITpro

Java 2D - Image basics: read, scale, display, write

Graphics2Dに描画させるのはどうでしょうか.

2番目のサイトにある以下のコードを利用します.

public static BufferedImage copy(BufferedImage source, BufferedImage 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;
}

このcopyメソッドを以下のように呼び出します.(srcImageは縮小する対象画像のBufferedImage)

copy(srcImage, new BufferedImage(100, 100, BufferedImage.TYPE_4BYTE_ABGR_PRE));

AffineTransformOpクラスでもなんとかなりそうなんですけど...

id:hedachi

試してみたところ、大変きれいに縮小できました!

ありがとうございます!

ただ1点だけ問題があって、

画像の透過された部分が黒や赤などで置き換えられてしまうようです。

GIF to GIFの変換なので、透過部分を透過のまま残しておきたいのですが

難しいでしょうか?


引き続きご回答をお待ちしています。

2008/02/10 23:46:08
id:mono-hate No.3

mono-hate回答回数4ベストアンサー獲得回数12008/02/11 01:39:55ここでベストアンサー

ポイント80pt

Java 2D - adding Transparency

上のサイトにいくつか方法があります.

一番簡単な方法は,一つ前に投稿したcopyメソッドの第2引数を次のように変更します.

copy(image, GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
                .getDefaultConfiguration().createCompatibleImage(100, 100, Transparency.BITMASK))
id:hedachi

お教え頂いた方法でうまくいきました!

英語なので敬遠してしまいましたが、リンク先のページも後でしっかり拝読しようと思います。

とっても助かりました。ありがとうございます!

2008/02/12 00:32:22

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません