DATE : 2006/08/17 (Thu)
「分割画像の作りかた」では、RenderingHints と ImageLayout を使用することで分割画像を作りました。
もうひとつ、javax.media.jai.TiledImage を使って分割画像を作る方法をメモしておきます。単純に分割画像を作るだけなら、こちらの方が使いやすいと思います。
TiledImage クラスには、コンストラクタが複数ありますが、簡単に分割画像を作るには、TiledImage(java.awt.RenderedImage, int, int) が便利です。int 型引数はそれぞれ、分割された画像片の幅と高さです。
以下に、100×100の大きさの画像片に分割するサンプルを示します。(source 変数に分割対象の画像オブジェクトが入っているとします。また、import 文などは省略しています)
TiledImage tiledImage = new TiledImage(source, 100, 100);
また、原点の座標などを指定するコンストラクタもあります。TiledImage(int, int, int, int, int, int, java.awt.image.SampleModel, java.awt.image.ColorModel) です。初めの2つの引数で原点を、次の2つで画像全体の大きさを、その次の2つで画像片の原点を指定します。また、最後の2つは、画像片のサンプルモデルとカラーモデルです。そのため、画像片の大きさはサンプルモデルで指定します。
以下に、このコンストラクタを使って100×100の画像片の画像を生成するコードを示します。ただし、原点は左上隅の座標(0, 0)とします(分割対象の画像オブジェクトは、source 変数に格納されています)。
// 分割対象の画像と互換性のあるサンプルモデル、カラーモデルを使用する
SampleModel tileSampleModel = source.getSampleModel().
createCompatibleSampleModel(100, 100);
ColorModel colorModel = source.getColorModel();
// 画像全体の大きさ
int width = source.getWidth();
int height = source.getHeight();
TiledImage tiledImage = new TiledImage(0, 0, width, height, 0, 0,
tileSampleModel, colorModel);
tiledImage.set(source);
このコンストラクタでは分割対象の画像を指定できないので、TiledImage#set(java.awt.image.RenderedImage) を使って画像を指定します。
なお、このコンストラクタで指定するサンプルモデルは、分割対象のサンプルモデルと互換性のあるものでなければなりません。そのため、java.awt.image.SampleModel#createCompatibleSampleModel(int, int)を使用して、異なる大きさで互換性のあるサンプルモデルを生成しています。また、カラーモデルについても、コンストラクタで指定したサンプルモデルを扱えるものでなければならないので、ここでは分割対象の画像と同じカラーモデルを使用しています。
参考文献
DATE : 2006/08/16 (Wed)
「JAI の簡単な使い方」では、javax.media.jai.JAI#create(String, java.awt.image.renderable.ParameterBlock) を使いました。この create メソッドは、操作内容の文字列とパラメータとを引数にとりますが、他にも、RenderingHints を引数に取る create メソッドがあります。(javax.media.jai.JAI#create(String, java.awt.image.renderable.ParameterBlock, java.awt.RenderingHints))
RenderingHints とは、java.awt.RenderingHints で定義されているクラスで、描画方法を指定できます。例えば、線を描画する際にはアンチエイリアスをかける、かけないといった指定などです。
JAI で用意されたレンダリングヒントを設定すると、分割画像を作ることができます。
具体的には、javax.media.jai.JAI#KEY_IMAGE_LAYOUT を使用します。このレンダリングヒントを指定して、内容として javax.media.jai.ImageLayout オブジェクトを指定します。
以下に、1つの分割画像が100×100の画像を生成するコードを示します。なお、分割対象の画像オブジェクトは source 変数に格納されているものとします。(import 文などは省略しています)
ImageLayout layout = new ImageLayout();
layout.setTileWidth(100);
layout.setTileHeight(100);
ParameterBlock parameter = new ParameterBlock();
parameter.addSource(source);
RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout);
RenderedImage result = JAI.create("Null", parameter, hints);
この記事では特に行う操作はないので、 create メソッドに Null 操作を指定しました。
ImageLayout オブジェクトの tileWidth, tileHeight プロパティを設定し、RenderingHints に格納、create メソッドに渡すことで、分割画像を作ることができます。
参考文献
DATE : 2006/08/10 (Thu)
実行可能な JAR ファイルを作るには、マニフェストファイルに MainClass: 属性を付けて、main メソッドを持ったクラスを完全修飾名で指定します。
Maven では、そのような属性を持ったマニフェストファイルを生成するような設定ができます。
MainClass: 属性を持つマニフェストファイルを生成する設定は、次のようになります。
(「...」部分は省略を表します)
<project ...>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>(メインクラスの完全修飾名)</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
...
</plugins>
...
</build>
...
</project>
maven-jar-plugin の archive 変数の設定を行うところがミソです。
参考文献
DATE : 2006/07/28 (Fri)
便利な割には忘れやすいメソッドなので、ここにメモしておきます。
java.util.Arrays#asList(T...) は、配列をリスト(java.util.List)に変換するメソッドです。
詳しくは上記の javadoc に書いてありますが、このメソッド、Java SE 5 になってからはとても便利になりました。というのも、総称(Generics)や可変引数、Autoboxing / Auto-Unboxing が Java SE 5 から使えるようになったので、次のようにリストを簡単に生成できるようになったのです。(import 文などは省略)
List<String> stringList = Arrays.asList("abc", "def");
int 型を格納するリストも作れます。
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
正確には、java.lang.Integer 型ですが、Autoboxing / Auto-Unboxing によって int 型と Integer 型は特に区別することなく使えます。
この java.util.Arrays#asList(T...) と java.util.Collections#unmodifiableList(java.util.List) を組み合わせれば、変更不可能なリストを手軽に作れてしまいます(配列の場合は、final 宣言をしても中身は書き換え可能です)。
List<Integer> integerList = Collections.unmodifiableList(
Arrays.asList(1, 2, 3, 4, 5));
ちなみに、Java SE 1.4 で asList メソッドを使用する場合は、次のようになります。
List stringList = Arrays.asList(new String[]{"abc", "def"});
List integerList = Arrays.asList(new Integer[]{
new Integer(0), new Integer(1), new Integer(2),
new Integer(3), new Integer(4), new Integer(5)});
String 型を格納するリストはまだしも、Integer 型は……('A`)
DATE : 2006/07/26 (Wed)
Java Advanced Imaging は、先日の記事のように簡単に使えます。
しかし、細かいところを操作しようとすると、Java 2D の知識が欠かせなくなってきます(例えば、画像にアルファ成分を追加するなどといった操作です)。
そこで、Java 2D のイメージングについてメモしようと思います。
イメージの構造
ここでは、RenderedImage などの、Java 2D での構造についてメモします。
Java 2D でのイメージは、次のような構成となっています。
- ラスター
- サンプルモデル
- データバッファ
- カラーモデル
- カラー領域
ラスター
ラスター(Raster)とは、ピクセルの値を集めたものです。ピクセルの「値」を集めたものなので、そこに色の概念は関係しません。ただ単に、ビット列としての画素値を扱います。
サンプルモデルとデータバッファ
データバッファ(DataBuffer)は、データを納めるもの、サンプルモデル(SampleModel)は、画素値をどのようにしてデータバッファに納めているかを表すものです。
データバッファは、1つのデータを表す形式(整数、浮動小数点数、符号なしなど)やビット幅を指定します。例えば、DataBuffer.BYTE を使用すると、8ビットでデータひとつを表現することになります。また、値を別々の配列に格納するバンクという仕組みもあります。
サンプルモデルは、イメージの大きさやバンド数を決めます。バンド数とは、各色成分のことをいいます。例えば、RGB で表現される色は赤成分・緑成分・青成分に分けられるので3バンド、ARGB ではアルファ成分が加わるので4バンド、グレイスケールは1つの成分しかないので1バンドとなります。
なお、データバッファに格納されるのはあくまでも「データ」であって、「画素値」ではありません。画素値をどのようなデータにして、どこのバンクに格納するかも、サンプルモデルが定めます。例えば、SinglePixelPackedSampleModel の場合は、1画素の全バンドを1つのデータ格納します。また、MultiPixelPackedSampleModel では、1バンドの複数画素を1つのデータに格納します。ComponentSampleModel では、1バンド1画素を1つのデータに格納します。このサブクラスには、異なるバンドを同じバンクに格納するか、別々のバンクに格納するかといった指定を行うものもあります。
カラーモデル
カラーモデル(ColorModel)は、画素値を色として解釈する方法を表します。例えば、 IndexColorModel は、1バンドの画素値を特定の色と対応付けます。例えば、0は黒、1は赤という具合です。また、PackedColorModel は、1バンドの画素値ひとつの中に複数成分の画素値があると見なします。例えば、0xffffff を、0xff, 0xff, 0xff と3成分に分けるようにです。ComponentColorModel は、1つの画素値には1つの成分があると見なします。
カラーモデルには、ラスターで表現された画素値を解釈するという機能上、扱えるサンプルモデルには制限があります。そのため、java.awt.image.ColorModel には、そのカラーモデルと互換性のあるサンプルモデルを生成するメソッドや、互換性を確かめるメソッドがあります。
カラー領域
カラーモデルで解釈される画素値が、RGB や HSV などのどの色空間に属するかといった情報は、カラー領域(ColorSpace)が管理します。