DATE : 2006/09/03 (Sun)
最近になって視力がガタ落ちになってきたので、眼鏡を作りました。
(;´Д`)生活する分には問題ないのですが、自動車免許の更新の際に問題になりそうなので
眼鏡屋で視力を測ってみると、左右で視力の差が激しいどころか、乱視も混じっていました(´・ω・)左右の差は昔からそうだったのですが、乱視もあるとは思いませんでした
というわけで眼鏡をかけてみたわけですが、これまで乱視が混じっていたせいか、かなりくっきりはっきりと見えるようになりましたヽ( ´∀`)ノ
(;^ω^)まるで、PC のディスプレイが新品になったようです
( ^ω^)とりあえず、PC を使うときには眼鏡をかけようと思います。
DATE : 2006/09/02 (Sat)
参考文献
- JDK 5.0 ドキュメント
- Java Advanced Imaging API FAQ - "Add a transparency mask (alpha channel) to an image." こちらには、3つのバンドからなる BufferedImage にアルファチャンネルを追加するサンプルコードが掲載されています。
DATE : 2006/09/01 (Fri)
(前回の記事)
3. BufferedImage 用の WritableRaster の色成分(アルファチャンネルを除いた成分)部分に、RenderedImage の画素値をコピーする
setColorSamples(destRaster, image.getData());
ここでは、対象の画像の Raster と、BufferedImage 用の WritableRaster を使って setColorSamples メソッドを呼び出しています。
setColorSamples の内容は、次の通りです。
private static void setColorSamples(WritableRaster dest, Raster src) { WritableRaster colorRaster = dest.createWritableChild( 0, 0, dest.getWidth(), dest.getHeight(), 0, 0, getBandListExceptAlpha(dest)); colorRaster.setRect(src); }
まず、 java.awt.image.WritableRaster#createWritableChild(int, int, int, int, int, int, int[]) を使って、色成分のみを表す WritableRaster を取り出します。このメソッドの最後の引数は、取り出すバンドの番号を並べた配列です。例えば、0, 1, 2 番のバンドを取り出す場合は、0, 1, 2 と格納された int 型の配列となります。ここでは、1つのバンドが色成分ひとつに相当すると考えても良いと思います。
なお、アルファ値は、最後のバンドがアルファ値のバンドになります(java.awt.image.ColorModel#getAlphaRaster(java.awt.image.WritableRaster) 参照。実際に、java.awt.image.ComponentColorModel のソースコードを調べると、確かに最後のバンドがアルファ値のバンドとして扱われていました)。
そこで、 getBandListExceptAlpha メソッドを使用して、アルファ値以外のバンド番号を取得します。このメソッドの内容は、次のようになります。
private static int[] getBandListExceptAlpha(Raster raster) { int[] bandList = new int[raster.getNumBands() - 1]; for (int i = 0; i < bandList.length; i++) { bandList[i] = i; } return bandList; }
ただ単に、全バンドから最後のバンド番号を除いた配列番号を生成しているだけです。
ただし、このメソッドは、アルファ値を持たない Raster を渡すとおかしな結果を返すことになります。今回は必ずアルファ値のバンドを持っているので、このような簡単な形になっています。
4. BufferedImage 用の WritableRaster にアルファチャンネル部分の値を設定する
setAlphaSamples(destRaster);
BufferedImage 用の WritableRaster を使って setAlphaSamples メソッドを呼び出しています。このメソッドの内容は、次の通りです。
private static final int ALPHA_VALUE = Integer.MAX_VALUE; private static void setAlphaSamples(WritableRaster raster) { int alphaBand = raster.getNumBands() - 1; for (int y = 0; y < raster.getHeight(); y++) { for (int x = 0; x < raster.getWidth(); x++) { raster.setSample(x, y, alphaBand, ALPHA_VALUE); } } }
引数の WritableRaster のアルファ値を表すバンドに、int 型の最大値を設定しています。この int 型の最大値は、アルファ値の最大値を表します。つまり、このメソッドでは、完全に不透明を表す値を設定していることになります。
なお、このメソッドもアルファチャンネルを持たない WritableRaster を渡すとおかしな結果になります。
5. BufferedImage 用の WritableRaster にアルファチャンネル部分の値を設定する
return new BufferedImage(destColorModel, destRaster, destColorModel.isAlphaPremultiplied(), null);
これまでの手順で BufferedImage 用の ColorModel や WritableRaster ができたので、これらを使った java.awt.image.BufferedImage のコンストラクタで BufferedImage を生成します。アルファの乗算状態は特にこだわらないので、ColorModel と同じ状態に設定しています。
以上で、アルファチャンネルを持った BufferedImage を生成することができました。
(了)
DATE : 2006/08/31 (Thu)
、> .|
>________ .|
 ̄ .|./_ _\ | | ____________
| / ヽ/ ヽ | | /
. | | ・ | ・ | V⌒i | 8がつのくせに
_ |.\ 人__ノ 6 | <
\ ̄ ○ / | 暑過ぎだぞ
. \ 厂 \
/ _____/  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
 ̄ ̄, -/へ/\/`- 、
/./ ./o i. \
(;^ω^)……まあ、8月ですからね。
私の部屋は南に面しているので、昼間は思いっきり直射日光が差し込んできます。下手に昼間まで寝込んだ日には、脱水症状に近い状態になったこともありました(今年は幸い、1回程度で済みましたが)。クーラーもなく、扇風機も寝るときにはかけないので、寝る前には水分補給が欠かせません。
ちなみに毎晩汗を流し続けたせいか、ほぼ家の中にいたにもかかわらず、体重が4、5キロ減少しました。秋から冬にかけて元に戻るような気もしますが(;^ω^)これはおそろしいダイエットですね
(;´Д`)それにしても、暑かったせいか、あまり物事に身が入らなかったような気がします。これからはもうちょっと気合を入れていこうと思います。
DATE : 2006/08/30 (Wed)
(前回の記事)
BufferedImage にアルファチャンネルを追加するコード(一部)は、次のようになります。(import 文などは省略してあります)。
ここで、image はアルファチャンネルを追加する対象の画像(RenderedImage)、最後の return 文で返されるオブジェクトが、アルファチャンネルが追加された画像(BufferedImage)です。
// 1 ColorModel destColorModel = createColorModelWithAlpha(image.getColorModel()); // 2 WritableRaster destRaster = destColorModel. createCompatibleWritableRaster( image.getWidth(), image.getHeight()); // 3 setColorSamples(destRaster, image.getData()); // 4 setAlphaSamples(destRaster); // 5 return new BufferedImage(destColorModel, destRaster, destColorModel.isAlphaPremultiplied(), null);
コメントで示したとおり、上のコードは5つの手順に分かれています。ここからは、それぞれの手順を細かく見ていくことにします。
1. BufferedImage 用に、アルファチャンネル付きの java.awt.image.ColorModel を生成する
ColorModel destColorModel = createColorModelWithAlpha(image.getColorModel());
ここでは、createColorModelWithAlpha メソッドに、対象となる画像のカラーモデルを渡すことでアルファチャンネル付きのカラーモデルを生成しています。
createColorModelWithAlpha メソッドは、次のようなメソッドです。
private static ColorModel createColorModelWithAlpha(ColorModel src) { return new ComponentColorModel(src.getColorSpace(), true, src.isAlphaPremultiplied(), Transparency.BITMASK, src.getTransferType()); }
渡されたカラーモデルと同じ色空間、アルファ値の乗算状態、サンプルの型で、それでいてアルファ値をもつようなカラーモデルを生成しています。
なお、「Transparency.BITMASK」は、透明部分が「完全に不透明、もしくは完全に透明」であることを表します。つまり、アルファ値が1(不透明)か0(透明)かに限定されるわけです。もしも、任意の透明度を設定したい場合は、「Transparency.TRANSLUCENT」にします。(Transparency インタフェースは、java.awt パッケージにあります)
2. BufferedImage 用に、上の ColorModel が扱える java.awt.image.WritableRaster を生成する
WritableRaster destRaster = destColorModel. createCompatibleWritableRaster( image.getWidth(), image.getHeight());
java.awt.image.ColorModel には、そのカラーモデルが扱える WritableRaster を生成するメソッドがあります。
そのため、ここではそのメソッドを利用することで、生成したカラーモデルが扱える WritableRaster を生成しています。
(つづきます)