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

javaの標準クラスライブラリでGIFを使えるイメージライブラリは出てきましたか?
今年の6月でGifの特許が切れたそうですが。。。
簡単な使い方を紹介してください。

●質問者: kunitz
●カテゴリ:コンピュータ
✍キーワード:6月 GIF Java イメージ クラス
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ozonepapa
●20ポイント

http://openlab.ring.gr.jp/kitaro/public_html/lab.java/ja_drawima...

JAVA Lab in Kitaro C3Lab(JA_DrawImage)

昔から、gifイメージ使えていたと思うのですが、

使えなかったのでしょうか。

J2sdkをインストールしたディレクトリのdemoフォルダのなかで、たくさん、gifファイル使っています。・j2sdk/demo/applets/ImageMapにもありますよ。

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Image.html

Image (Java 2 Platform SE v1.4.2)

java.awt.imageはabstractクラスですね。

◎質問者からの返答

ありがとうございます!

あれ、そういえばそうですよね。。。


2 ● last_wednesday
●20ポイント

http://www.google.co.jp/

Google

URLはダミーです。

読み込みや書き込みはjavax.swing.ImageIconのgetImage();やjava.awt.toolkit.getDeaultToolkit().createImage();やjavax.imageio.ImageIO.read()/write();などで行えると思います。

標準APIだと、あとはjava.awt.image.BufferedImageを取得したり、さらにjava.awt.Graphics2Dを取得するなどして処理することになると思います。拡大や縮小、回転などはjava.awt.image.AffineTransformOpが役に立ちます。

File file = new File(”path”);//読み込み元ファイル(URLなども使用可能)

BufferedImage bufferedImage = ImageIO.read(file);//ファイルからの読み込みの例

Bufferedimage partImage = bufferedImage.getSubimage(0, 0, 200, 200);//部分イメージを取得

partImage = (new AffineTransformOp(AffineTransform.getScaleInstance(0.5, 0.5), null)).filter(partImage, null);//サイズを1/2に変更

partImage = (new AffineTransformOp(AffineTransform.getRotateInstance(Math.PI/4, 50, 50), null)).filter(partImage, null);//座標(50, 50)に対してpi/4(rad)回転

partImage = (new AffineTransformOp(AffineTransform.getTranslateInstance(20, 20), null)).filter(partImage, null);//右に20、下に20平行移動

Graphics2D g2d = (Graphics2D)partImage.getGraphics();//Graphics2Dの取得

..//g2dに対して処理(絵や文字を描く)

ImageIO.write(partImage, ”gif”, file);//ファイルに保存

AffineTransformOpは、AffineTransformのインスタンスを使って変換を指定しインスタンスを作成し、filter();メソッドを使って変換されたBufferedImageを取得することができます。AffineTransformの必要な変換を表現したインスタンスは、staticメソッドから取得すると簡単です。ただ、特殊な変換は自分でコンストラクタからつくる必要があるかも。

それから、使ったことはないですが、ImageにgetScaledInstance();というサイズ変更メソッドがあるみたいです。場合によってはこの方が簡単かも。

標準APIだと、GIF、JPEG、PNGが読み書きできたと思います。

http://java.sun.com/products/java-media/jai/index.jsp

Java Media APIs

オプションパッケージだと、Java Advanced Imaging (JAI) APIでさらに多くのファイル形式について読み書きしたり、いろいろなことが行えるようです。

こちらはほとんど知りません。

◎質問者からの返答

ありがとうございます!


3 ● last_wednesday
●20ポイント

http://www.hatena.ne.jp/1090330462#

javaの標準クラスライブラリでGIFを使えるイメージライブラリは出てきましたか? 今年の6月でGifの特許が切れたそうですが。。。 簡単な使い方を紹介してください。.. - 人力検索はてな

URLはダミーです。

上の回答を書いた者ですが、補足です。

・まず、上のソース3行目のBufferedImageのIがiになっていました。訂正します。

・それから、AffineTransformOp/AffinTransform(java.awt.geom.AffineTransform)を利用した変換はイメージそれ自体を変換するものです。

イメージそれ自体は変換せずにイメージ内に描かれているものを変換するには、Graphics2DのdrawImageメソッドを使います。

以下は前述の例と同じ変換を行うものですが、イメージはもとのイメージと同じ大きさ・形のままです。この例だとイメージが重なった感じ

になります。

Graphics2D g2d = (Graphics2D)partImage.getGraphics();

g2d.drawImage(partImage, AffineTransform.getScaleInstance(0.5, 0.5), null);

g2d.drawImage(partImage, AffineTransform.getRotateInstance(Math.PI/4, 50, 50), null);

g2d.drawImage(partImage, AffineTransform.getTranslateInstance(20, 20), null);

・BufferedImageのgetSubimage()メソッドによって得られるイメージはもとのイメージとデータを共有します。

共有させたくない場合は、新しくBufferedImageのインスタンスを作成してGraphics2Dを取得し、drawImage()を使って描画する必要があると

思います。

・java.awt.imageパッケージの*Opという名前のクラスはAffineTransformOpのように、BufferedImageに対して何らかの変換を行うためのクラ

スです。

使い方もあまり変わらないと思います。

◎質問者からの返答

ありがとうございます!

http://www.hcn.zaq.ne.jp/no-ji/javamemo/javax_imageio_ImageI...

によると

>読み込むときは、PNG,JPG,GIFに対応している。

>そして書き込むときには、PNG,JPGに対応している。

>GIFが書き込めないのはUNISYS社のライセンスによるものだろう。

GIFの書き出しはどうなんでしょうか?

関連質問


●質問をもっと探す●



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