Archive for 12th 6月 2009

IndexColorModel

gifイメージの出力の続きです
じゃあIndexColorModelとはなんなのか。

先回参照したhttp://wisdom.sakura.ne.jp/system/java/awt/Gjava40.html
にわかりやすく記載されているのですが、ずっとどうもピンと来なかった。

bitsには1ピクセル当たりのビット数を
sizeには色成分の配列のサイズ(要素数)を指定します

r[]には赤成分の配列、g[]には緑成分の配列、b[]には青成分の配列を指定します
たとえば r[0] = 255 , g[0] = 0 , b[0] = 0 で、インデックス0番が赤になります

ってこれがそのままズバリだったのですが、ピクセル?赤緑青の配列?
とか色々考えてしまいハマりました。

ソースコードを引用させていただきます。

import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
 
/*	
 
*/
 
public class test extends Applet {
	Image img;
	MemoryImageSource mi;
	public void init() {
		byte a[] = { (byte)100 , (byte)255 , (byte)20 };
		byte r[] = { (byte)255 , (byte)0 , (byte)0 };
		byte g[] = { (byte)0 , (byte)255 , (byte)0 };
		byte b[] = { (byte)0 , (byte)0 , (byte)255 };
		IndexColorModel icm = new IndexColorModel(8 , 3 , r , g , b , a);
 
		int ary[] = { 0 , 0 , 0 , 1 , 1 , 1 , 2 , 2 , 2 ,
			   2 , 2 , 2 , 0 , 0 , 0 , 1 , 1 , 1 };
		mi = new MemoryImageSource(9 , 2 , icm ,ary , 0 , 9);
		img = createImage(mi);
	}
	public void paint(Graphics g) {
		g.drawImage(img , 0 , 0 , 300 , 300 , this);
	}
}

で、言えば、以下のようなパレットが作成されることになります。
パレット番号0 → alpha 100, red 255, green 0, blue 0 = 0×64ff0000
パレット番号1 → alpha 255, red 0, green 255, blue 0 = 0xff00ff00
パレット番号2 → alpha 20, red 0, green 0, blue 255 = 0×140000ff

alpha, red, green, blueのバイト配列を作成し、その添字が番号となるわけです。
上記は3パターンですが、これを増やせば扱う色のバリエーションも増えるわけです。
GIFであれば、Webセーフカラーの216色の
パレットを作れば良いかな?
配列の上限数が[Java][Tips] Javaの配列の大きさは、いくつまで指定できるかによれば

よって「Javaの配列の次元数あたりの長さに指定できる最大値は、int型の正の値の最大値である」ということになりそうです。

だそうなので、約21億通りの色が保持出来るのだろうか。やらないけど。ヒープが足りなくなりそうだから。

そして透過色はどのようにするか?
IndexColorModelのソースコードを見ると(長いのでsetRGBsの一部だけ)

	int alpha = 0xff;
        int transparency = OPAQUE;
	boolean allgray = true;
	for (int i = 0; i < size; i++) {
	    int rc = r[i] & 0xff;
	    int gc = g[i] & 0xff;
	    int bc = b[i] & 0xff;
	    allgray = allgray && (rc == gc) && (gc == bc);
	    if (a != null) {
		alpha = a[i] & 0xff;
		if (alpha != 0xff) {
		    if (alpha == 0x00) {
			if (transparency == OPAQUE) {
			    transparency = BITMASK;
			}
			if (transparent_index < 0) {
			    transparent_index = i;
			}
		    } else {
			transparency = TRANSLUCENT;
		    }
		    allgray = false;
		}
	    }
	    rgb[i] = (alpha << 24) | (rc << 16) | (gc << 8) | bc;
	}

どうも、アルファ値が0xffでなくて、0xffの場合にOPAQUE
(完全に不透明であることが保証される)
ならばBITMASK
(完全に不透明 (アルファ値が 1.0) である、あるいは完全に透明)に変更されるようです。
0xffと0×00以外ならTRANSLUCENT
(任意のアルファ値)
になるようです。gifの場合は透過色をひとつしか指定出来ないということで、BITMASKが指定されれば良い。
ということは、アルファ値を0×00にすれば良さそうですね。

次回は実際にやってみます。
それにしても画像表示系の処理は論理演算やシフト演算が多いです。


サラでGalileoその2

eclipse35galileoを入れたの続きです。

SVN Connectorがない件は、Subversiveプラグインを一度アンインストールして、
http://www.polarion.com/products/svn/subversive.phpからコネクタ毎入れてみたらなぜか正常にインストール出来た。
(原因がちょっとわからないが・・・)

そしてもともと作成しておいたサンプルプロジェクトをチェックアウトしたら、q4eがないのでMavenが使えない。

じゃあq4e入れるかと思い、q4eのサイトを見たら

Q4E is now Eclipse IAM

と書いてある。
そのリンクに飛んでみたらEclipse本体のプラグインになってる。I AMというのだそうだ。

更新サイトに
http://q4e.googlecode.com/svn/trunk/updatesite-iam/
を指定してインストールしてみる。

Toolingの子に

Eclipse IAM Dependency Viewer
Eclipse IAM Editors

とあり、ああ、あのER図みたいに依存関係を表示してくれるやつとエディタだな、と思い、必要だと思ったので選択して「インストール」したら。

Cannot complete the install because one or more required items could not be found.
Software being installed: org.eclipse.iam.feature.dependencyviewer.feature.group 0.9.0.200905051159
Missing requirement: org.eclipse.iam.feature.dependencyviewer.feature.group 0.9.0.200905051159 requires ‘com.ibm.icu [3.6.0,4.0.0)’ but it could not be found

なんか前にもq4eでこんなエラーを見たような・・・。com.ibm.icuがないと言ってると思うのだが・・・。前も解決できなかったと思ったけど調べてみるしかない。

Toolingを選択しなければ他は問題なくインストール出来たが、やはり「view dependencies」や、pom.xmlのエディタが入ってない。