DATE : 2006/08/21 (Mon)
java.awt.image.RenderedImage から java.awt.image.BufferedImage を生成するには、次のような手順で行います。
- RenderedImage からカラーモデル(java.awt.image.ColorModel)とラスター(java.awt.image.Raster)を取得する。
- ラスターは読み取り専用なので、書き換え可能なラスター(java.awt.image.WritableRaster )を取得する。
- WritableRaster と ColorModel から、BufferedImage を生成する。
コードにすると、次のようになります。ここで、source は BufferedImage を生成するための RenderedImage です。(import 文などは省略してあります)
ColorModel colorModel = source.getColorModel();
WritableRaster raster = source.getData().
createCompatibleWritableRaster();
BufferedImage image = new BufferedImage(colorModel, raster,
colorModel.isAlphaPremultiplied(), null);
コードに示したとおり、BufferedImage には、WritableRaster や ColorModel からインスタンスを生成できるコンストラクタがあります。
その最後から2番目の引数は、アルファ値を Raster のデータにあらかじめ乗算しておくかどうかを指定します。ここでは特にこだわらないため、ColorModel の設定どおりにしました。
また最後の引数は java.util.Hashtable で、画像のプロパティを設定できます。ただし、今回はプロパティがないので null にしました。(BufferedImage のソースコードを見たところ、null に対応するコードがあったので、特に問題はないと思います)
参考文献
DATE : 2006/08/19 (Sat)
「分割画像の作りかた」や「分割画像の作りかた 2」で生成した分割画像片を BufferedImage に取り出すには、次のようなコードを記述します。
なお、tileX は分割画像の水平方向での番号、tileY は垂直方向での番号です。また、対象の分割画像を格納する source は javax.media.jai.PlanarImage です(RenderedOp や TiledImage も PlanarImage です)。(import 文などは省略してあります)
Rectangle tileRect = source.getTileRect(tileX, tileY);
BufferedImage tile = source.getAsBufferedImage(tileRect,
source.getColorModel());
getTileRect メソッドで画像片の領域を取得し、その領域内の内容を BufferedImage として取得します。
簡単なコードですが、API ドキュメントの中に埋もれていたので取り上げてみました。
((´・ω・)実際、気付くまではちょっと非効率なコードを書いていました)
DATE : 2006/08/18 (Fri)
最近、デルやアップルのノート PC が炎上するという事故が発生しています。どうも、その原因はリチウムイオンバッテリーだそうです。リチウムイオンバッテリーはメモリー効果がないことで有名ですが、反面、安全機構がないと過充電時に破裂する危険性もあります。
なんとなく不安になってきたので、私もノート PC のバッテリーをチェックしてみました((;´Д`)炎天下の中、起動しっぱなしで放置していますし)。
結果、ニッケル水素電池でした。しかし、ニッケル水素電池にはメモリー効果が……(ニカド電池よりも顕著ではないそうですが)
(;^ω^)いいのか悪いのか……
参考文献
- リチウムイオン二次電池 - Wikipedia
- ニッケル・水素蓄電池 - Wikipedia
- メモリー効果 - Wikipedia
- デル、ノートPC用バッテリー410万本をリコール・製造はソニー
- PowerBookも(また)爆発炎上 こちらは、韓国 LG Chem 社製造だそうです
DATE : 2006/08/17 (Thu)
今日、NTT の支社から電話がかかってきました。
(*゚ー゚)「もしもし、NTT □日本の※※※※※の※※※※※と申します。○○様でしょうか?」
( ^ω^)「はい。そうです」
(*゚ー゚)「○○様の地域で光回線が全面開通しましたので、一軒一軒お知らせいたしております」
( ^ω^)「それはどうも」
(*゚ー゚)「ところで、○○様はどのような回線をお使いですか? ADSL とか……」
(;^ω^)「いえ、すでに NTT の光回線を使っております」
(; ゚ー゚)「あ、それはどうも。これからもよろしくお願いいたします」
(;^ω^)「あ、はい。どうも」
(*゚ー゚)「それでは失礼いたします」
(;^ω^)……
……と、細部は忘れましたが、大まかにはこんな会話でした。
(;´Д`)光回線を使っているところに光回線開通のお知らせが来てしまいました。
(;^ω^)同じ NTT のはずですが、回線使用者の情報は共有されていないんでしょうか……
(;^ω^)もっとも、個人情報保護法か社内のセキュリティ上の関係で連携に制限があるのかもしれませんが。
と、まあ、不思議な電話がかかってきた一日でした。
(;´Д`)おや、前にも同じような電話がかかってきたような気もしますが……
(;^ω^)気のせいでしょう
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)を使用して、異なる大きさで互換性のあるサンプルモデルを生成しています。また、カラーモデルについても、コンストラクタで指定したサンプルモデルを扱えるものでなければならないので、ここでは分割対象の画像と同じカラーモデルを使用しています。