DATE : 2006/09/14 (Thu)
(前回の記事)
メソッドの抽出 (2)
前回に続いて、「3 : 2の WritableRaster の色成分を設定」の部分
// 色成分のバンド番号の配列 int[] colorBandList = getColorBandList(destRaster.getNumBands()); // 色成分のみの WritableRaster WritableRaster colorRaster = destRaster. createWritableChild(0, 0, width, height, 0, 0, colorBandList); colorRaster.setRect(image.getData());
を、setColorSamples メソッドに抽出します。
/** * 指定の WritableRaster の色成分を設定します。 * * @param dest 色成分を設定する WritableRaster * @param src 色成分を表す Raster */ private static void setColorSamples(WritableRaster dest, Raster src) { WritableRaster colorRaster = dest.createWritableChild( 0, 0, dest.getWidth(), dest.getHeight(), 0, 0, getColorBandList(dest.getNumBands())); colorRaster.setRect(src); }
colorBandList に格納する配列を生成するメソッド getColorBandList を、dest.createWritableChild メソッドの引数に埋め込みました。
ここで、 getColorBandList というメソッド名は分かりにくいので、分かりやすい名前に変更します。このメソッドの中身は、次の通りでした。
private static int[] getColorBandList(int numBands) { int[] bands = new int[numBands - 1]; for (int i = 0; i < bands.length; i++) { bands[i] = i; } return bands; }
アルファ成分を格納するバンドはバンド列中の最後となっています。そのため、アルファ成分のバンドを除いたバンド列の配列を返します。「アルファ成分のバンドを除く」という部分を強調して、getColorBandList から getBandListExceptAlpha にメソッド名を変更します。
また、バンド列を扱うのは Raster(WritableRaster)のみなので、getBandListExceptAlpha メソッドの引数は Raster にして、メソッドの中でバンド数を取得することにします。
/** * 指定のバンド数から、アルファ成分を除いたバンド番号の配列を * 返します。 * * @param raster アルファ成分を除いたバンド番号の配列を取得する Raster * @return アルファ成分を除いたバンド番号の配列 */ 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; }
すると、setColorSamples メソッドは次のようになります。
/** * 指定の WritableRaster の色成分を設定します。 * * @param dest 色成分を設定する WritableRaster * @param src 色成分を表す Raster */ 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); }
そして、「3 : 2の WritableRaster の色成分を設定」の部分は次のように変わります。
setColorSamples(destRaster, image.getData());
(つづきます)
DATE : 2006/09/13 (Wed)
特許をとられていて見事に散った前企画(('A`) 企画練り直し)ですが、なんとか新しい企画をひねり出しました。
(;^ω^)電車の中で3分ぐらいで考えました
前回の轍を踏まないように「特許電子図書館」で検索してみたところ、なんとか特許を回避できそうな予感です(漏れがあるかもしれませんが(´・ω・`))。
Google でそれらしきキーワードで検索しても似たようなサービスはありませんでした。
(;^ω^)なので、たぶん大丈夫でしょう
('A`)もっとも、前の企画のときも、Google で類似したサービスを検索していた時にはなぜか出てこなかったので、油断は禁物ですが
DATE : 2006/09/12 (Tue)
(前回の記事)
メソッドの抽出 (1)
前回の記事では、処理手順の通りに処理を並び替えました。
そこで、並び替えた処理をメソッドに抽出します。
まずは、「1 : アルファチャンネル付きのカラーモデルの生成」の部分
// 対象画像のカラースペース ColorSpace sourceColorSpace = image.getColorModel().getColorSpace(); // アルファチャンネルのあるカラーモデル ColorModel destColorModel = new ComponentColorModel( sourceColorSpace, true, false, Transparency.BITMASK, DataBuffer.TYPE_BYTE);
を、createColorModelWithAlpha メソッドとして抽出します。
/** * アルファチャンネルを追加したカラーモデルを生成します。 * * @param src アルファチャンネルを追加する元となるカラーモデル * @return アルファチャンネルを追加したカラーモデル * @throws NullPointerException src が null の場合 */ private static ColorModel createColorModelWithAlpha(ColorModel src) { return new ComponentColorModel(src.getColorSpace(), true, src.isAlphaPremultiplied(), Transparency.BITMASK, src.getTransferType()); }
抽出前のコードには、ColorSpace を格納するローカル変数がありましたが、オブジェクトに問い合わせる形(src.getColorSpace())に変更しました。
また、アルファが直前に乗算されているかどうかやデータの転送型は、引数のカラーモデルに従うように修正しました。
この部分は、メソッドに分けて初めて気が付いた部分です。メソッドに分けると、こういった細かい部分に気が向くので便利ですね( ´∀`)b
すると、「1 : アルファチャンネル付きのカラーモデルの生成」の部分は次のようになります。
ColorModel destColorModel = createColorModelWithAlpha(image.getColorModel());
とてもシンプルになりました。
ちなみに、「2 : 1のカラーモデルを扱える WritableRaster の生成」の部分は、「1のカラーモデルを扱える WritableRaster の生成」という意味がコードそのものに表れているので、メソッドには抽出しません。
WritableRaster destRaster = destColorModel. createCompatibleWritableRaster(width, height);
ただし、width, height という変数の中身はコードの上の方に定義されているので読みづらく感じます。そこで、これもオブジェクトに問い合わせる形に変更します。
WritableRaster destRaster = destColorModel. createCompatibleWritableRaster( image.getWidth(), image.getHeight());
(つづきます)
DATE : 2006/09/11 (Mon)
ふと、携帯電話を建物に向けるとその建物の情報(歴史的建造物の場合は、その歴史など)を表示できるようなシステムを考えていろいろと準備をしていたのですが、ある日ネットを巡回していると……
携帯端末を対象物に向けてポインティングすることで、情報を入手する技術 (「あれは何だろう?」や「どうやって目的地にたどり着けるだろう?」)
( ´∀`)……
(つд⊂)ゴシゴシ
(;゚ Д゚)
Pointing Systems For Addressing Objects (US Patent 7,031,875)(日本語版、PDF)
(;゚Д゚)
見事にほとんど同じものが特許に取られていました orz
GeoVector on Japanese TV (in Japanese)(WMV)
トンカツ食べヨウ!(デモンストレーションでのセリフ。その後、トンカツ屋に携帯電話を向けると、周辺に存在するレストランが検索される)
(# ^ω^)
・゚・(つД`)・゚・
(;´Д`)これはさすがに企画を練り直さないとまずそうです。
(;^ω^)ちなみに、この企画以前には、建物を携帯電話で撮影するとその建物の情報が取得できるシステムを考えていました。いろいろと調べた末、結構な計画になってしまうので今回の企画に変更したのですが、見事にドツボにはまってしまったようです。
ちなみに、建物を携帯電話で撮影して……というシステムも、海外の企業が手がけているようです。(ケータイのカメラで写真を撮る→撮った写真で検索)
(;^ω^)みんな考えることは同じですね
DATE : 2006/09/10 (Sun)
(前回の記事)
処理の順序を整理する
まず手始めに、addAlpha メソッドの処理の流れを整理します。
とりあえず、「アルファチャンネルを追加した BufferedImage を作成する - 処理手順」に従ってコードを整理します。
整理した addAlpha メソッドは、次の通りです(javadoc コメントは省略しています)
private static RenderedImage addAlphaChannel(RenderedImage image) { // 対象画像の大きさ int width = image.getWidth(); int height = image.getHeight(); // 1 : アルファチャンネル付きのカラーモデルの生成 // 対象画像のカラースペース ColorSpace sourceColorSpace = image.getColorModel(). getColorSpace(); // アルファチャンネルのあるカラーモデル ColorModel destColorModel = new ComponentColorModel( sourceColorSpace, true, false, Transparency.BITMASK, DataBuffer.TYPE_BYTE); // 2 : 1のカラーモデルを扱える WritableRaster の生成 WritableRaster destRaster = destColorModel. createCompatibleWritableRaster(width, height); // 3 : 2の WritableRaster の色成分を設定 // 色成分のバンド番号の配列 int[] colorBandList = getColorBandList(destRaster.getNumBands()); // 色成分のみの WritableRaster WritableRaster colorRaster = destRaster. createWritableChild(0, 0, width, height, 0, 0, colorBandList); colorRaster.setRect(image.getData()); // 4 : 2の WritableRaster のアルファ成分を設定 WritableRaster alphaRaster = destRaster. createWritableChild(0, 0, width, height, 0, 0, new int[]{destRaster.getNumBands() - 1}); // 可視領域を表すアルファ成分のみの Raster WritableRaster visibleMaskRaster = createVisibleAlphaRaster(image); alphaRaster.setRect(visibleMaskRaster); // 5 : BufferedImage の生成 return new BufferedImage(destColorModel, destRaster, false, null); }
番号の振ってあるコメントは、「アルファチャンネルを追加した BufferedImage を作成する - 処理手順」の各手順を表しています。
具体的には、次のようにして処理の整理を行いました。
- 1 : アルファチャンネル付きのカラーモデルの生成
- アルファチャンネルのあるカラーモデルを生成しているところで処理を区切りました。
- 2 : 1のカラーモデルを扱える WritableRaster の生成
- 1の直後にある、WritableRaster を生成している処理で区切りました。
- 3 : 2の WritableRaster の色成分を設定
- アルファ成分を表す WritableRaster にデータを設定している部分の直前で一旦区切りました(具体的には、
alphaRaster.setRect(visibleMaskRaster);
の直前)。しかし、この部分には、アルファ成分に関係する処理も含まれています。そこで、アルファ成分に関係する処理を4に移しました(具体的には、WritableRaster alphaRaster = destRaster. createWritableChild(0, 0, width, height, 0, 0, new int[]{destRaster.getNumBands() - 1});
// 可視領域を表すアルファ成分のみの Raster WritableRaster visibleMaskRaster = createVisibleAlphaRaster(image);
の処理です) - 4 : 2の WritableRaster のアルファ成分を設定
- 3で移された処理を含めて、アルファ成分のデータを設定しているところで区切りました。
- 5 : BufferedImage の生成
- 最後に BufferedImage を生成しているので、この部分を5としました。
これで順序ごとに処理が分けられたので、ある程度は見やすくなりました。しかし、全体が長いためか、あまり分かりやすいようには思えません。
そこで、順序ごとに分けた部分を、メソッドとして抽出していきたいと思います。
(つづきます)