- PR -

JDK1.4で複数画像を1つの画像にまとめたい

投稿者投稿内容
焼きそば
ベテラン
会議室デビュー日: 2002/11/06
投稿数: 86
お住まい・勤務地: 東京
投稿日時: 2006-01-29 10:39
焼きそばです。

現在JDK1.4で画像編集処理について
悩んでいます。
ImageIOクラスを用いてやるのではと
見当をつけている段階ですが、
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/imageio/spec/apps.fm4.html
を見るとwriteInsertでできそうな気がするのですが、
私の望んでいることと合致する内容なのでしょうか?

また、同様の処理をなさった方がいらっしゃれば
ご教示頂きたいと思います。

以上、よろしくお願いいたします。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-01-29 13:47
「複数画像を1つの画像にまとめたい」の意味が分かりません。TIFF のようなマルチページでまとめたいのか、アニメーション GIF のように時系列でまとめたいのか、画像を縦または横にならべてより大きな画像にしたいのか。
焼きそば
ベテラン
会議室デビュー日: 2002/11/06
投稿数: 86
お住まい・勤務地: 東京
投稿日時: 2006-01-29 14:57
焼きそばです。

未記入さん、ご返答ありがとうございます。

引用:

未記入さんの書き込み (2006-01-29 13:47) より:

画像を縦または横にならべてより大きな画像にしたいのか。




↑が実現したいことになります。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2006-01-29 15:25
焼きそばさん、こんにちは。

簡単な方法として、
1.必要なサイズのjava.awt.image.BufferedImageのオブジェクトを生成。
2.そのイメージから Graphicsオブジェクトを取得。
3.複数の画像を各々 drawImage()する。
これで大きなイメージが出来上がります。
大きなイメージのファイルが必要なら、さらに
4.javax.imageio.ImageWriterでファイルに出力。
します。

なお、最初の BufferedImageはコンストラクタを使用しても
良いですが、描画に使うときは java.awt.Componentクラスの
createImage(int, int)を使用すると簡単です。

参考になるでしょうか?
焼きそば
ベテラン
会議室デビュー日: 2002/11/06
投稿数: 86
お住まい・勤務地: 東京
投稿日時: 2006-01-29 15:39
焼きそばです。

Kissingerさん、ご返答ありがとうございます。

引用:

Kissingerさんの書き込み (2006-01-29 15:25) より:

簡単な方法として、
1.必要なサイズのjava.awt.image.BufferedImageのオブジェクトを生成。
2.そのイメージから Graphicsオブジェクトを取得。
3.複数の画像を各々 drawImage()する。
これで大きなイメージが出来上がります。
大きなイメージのファイルが必要なら、さらに
4.javax.imageio.ImageWriterでファイルに出力。
します。

なお、最初の BufferedImageはコンストラクタを使用しても
良いですが、描画に使うときは java.awt.Componentクラスの
createImage(int, int)を使用すると簡単です。

参考になるでしょうか?



現在、これを確認できる場所におりませんので
すぐの検証結果は提示できませんが、
要するに、
1,2ででかい空白のイメージ(1)を作成し、
3で読み込んだファイルを(1)のイメージに
ペタペタ貼っていくというような感じですね。

大体のイメージは掴めました。
火曜日まで検証できませんが、何とかなりそうです。

画像編集は何分初めてなものでして、
どこから見当つければよいか腐心しております。

検証の結果は改めてご報告させて頂きます。
焼きそば
ベテラン
会議室デビュー日: 2002/11/06
投稿数: 86
お住まい・勤務地: 東京
投稿日時: 2006-01-31 10:45
焼きそばです。

検証結果を報告させて頂きます。
結論から申しますと実現できたと思います。
ご回答頂いた方々ありがとうございました。

コード:
  File outFile;
  File outFile2;
  Date date = new Date();
  String filename = date.getTime() + "_01.png";
  String filename2 = date.getTime() + "_02.png";
  String outFileName = date.getTime() + "_out.png";
  // 画像まとめテスト
  Iterator writers = ImageIO.getImageWritersByFormatName("png");
  ImageWriter writer = (ImageWriter)writers.next();
  ImageOutputStream ios = ImageIO.createImageOutputStream(new File(outFileName));
  writer.setOutput(ios);

  // キャンパスイメージ作成
  BufferedImage canpas_image = new BufferedImage(600,600,BufferedImage.TYPE_INT_BGR);
  // Graphicsオブジェクト取得
  Graphics2D g2 = canpas_image.createGraphics();
  Image f_image,s_image;
  IIOImage iio;

  try {
    outFile = new File(filename);
    outFile2 = new File(filename2);
    f_image = ImageIO.read(outFile);
    s_image = ImageIO.read(outFile2);

    // 読み取ったイメージをキャンパスに出力
    g2.drawImage(f_image,0,0,300,300,Color.WHITE,null);
    g2.drawImage(s_image,300,0,300,300,Color.WHITE,null);

    iio = new IIOImage(canpas_image,null,null);
    writer.write(iio);
  } catch (Exception e) {
    e.printStackTrace();
  } finally {
    writer.dispose();
    ios.close();
  }




上記で画像をまとめることができました。
ただ、Kissingerさんの仰られた
引用:

なお、最初の BufferedImageはコンストラクタを使用しても
良いですが、描画に使うときは java.awt.Componentクラスの
createImage(int, int)を使用すると簡単です。


ができませんでした。
Componentクラスを初期化できないようです。

上記ソースにご指摘などがあればよろしくお願いいたします。

Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2006-01-31 11:41
焼きそばさん、こんにちは。

引用:
Componentクラスを初期化できないようです。



newしただけの Componentからは createImage()できません。
Frame, Dialog, Window, Appletかそれらのサブクラス上に
配置され、表示可能になっていなければいけません。

私は、java.awt.Component#addNotify()をオーバライドして、
そのタイミングで createImage()します。
コード:
public void addNotify() {
     super.addNotify(); // これを忘れると悲惨
     image = createImage(w, h);
}


のような感じで。
焼きそば
ベテラン
会議室デビュー日: 2002/11/06
投稿数: 86
お住まい・勤務地: 東京
投稿日時: 2006-01-31 11:53
焼きそばです。

Kissingerさん、ご返答ありがとうございます。

引用:

Kissingerさんの書き込み (2006-01-31 11:41) より:

newしただけの Componentからは createImage()できません。
Frame, Dialog, Window, Appletかそれらのサブクラス上に
配置され、表示可能になっていなければいけません。




今回はWebシステム上で画像を出力します。
そのためFrameなどのクラスは使用しないつもりなのですが、
そうなるとBufferedImageのコンストラクタを使用した方が
良いのでしょうか?

見当違いのことを述べていたらすみません。

スキルアップ/キャリアアップ(JOB@IT)