人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: hedachi
●カテゴリ:コンピュータ インターネット
✍キーワード:GIF Java カラー ネット 検索
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● wnagata
●10ポイント

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

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

◎質問者からの返答

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

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

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

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

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


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オブジェクトをファイルに出力する方法も

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


2 ● mono-hate
●80ポイント

「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クラスでもなんとかなりそうなんですけど...

◎質問者からの返答

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

ありがとうございます!

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

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

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

難しいでしょうか?


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


3 ● mono-hate
●80ポイント ベストアンサー

Java 2D - adding Transparency

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

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

copy(image, GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
 .getDefaultConfiguration().createCompatibleImage(100, 100, Transparency.BITMASK))
◎質問者からの返答

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ