Win32でRGBImageFilter で alpha を操作して透明・半透明を得 ようとするとバグらしき物に見舞われます。 #他の環境はどうなんでしょう? 発生条件: ・フィルタに与える ImageProducer の出所が、createImage() で得た Image であること。getImage() でファイルから得た Image の場合は、なぜか大丈夫。 #言うまでもなく、ファイル起源であっても一旦drawImage #した物をフィルタに通したら、バグります。 ・フィルタで、alpha < 0xff に変換されるピクセルが少なくと も1箇所は存在すること。 現象: JDK 1.0.2, WinCafe 1.20, Netscape 3.01: 画像右上端からスキャン順序に沿って、最初に現れる alpha < 0xff のピクセルまでが、全ピクセル透明になって しまう。 #したがって周辺部が透明な画像(もっともよくあるパタ #ーン)を作る場合は問題なし。 Netscape2.01[ja]: ほぼ全面が、alpha最低値の背景強度になり、フィルタに通 した前面画像はまったく表示されない。 #はっきり言ってムチャクチャ。打つ手なし? 解決策: (Netscape2.01[ja]は見捨てるとして)x=0,y=0に(半)透明 ピクセルを置く方法しか思い付きません。ImageProducer/Consumer などを理解なさっている方なら他の方法を見つけてくださるで しょうか? もっとも有用な解決策は、元 Image に手を加えて、少なくと も x=0,y=0の1ピクセルは(半)透明化されるようにすること でしょう。場合によっては、y=0を「捨てライン」と割り切っ て、あらかじめ縦に1ドット大きめにcreateImageしておく必 要があるかもしれません。 元Imageに手を加えられない場合は、フィルタ側でx=0,y=0 の 1ドットだけ alpha = 0 にしてしまいます。(ソース参照) canFilterIndexColorModel = false; にしなくてはならないので、環境によっては処理速度が落ちる かも知れません。 いずれにせよ、背景画像にも手を加えて、x=0,y=0の1ピクセル が目立たないような色にしたほうがよいでしょう。(サンプル アプレットはわざと目立つままにしています) 最初は alpha &= 0xfe にしていましたが、Netscape3.01 では これではバグは取れませんでした。 どうやらディザで半透明を実現してるようなので、1ドットで はディザにならず、Netscapeの場合はここが不透明になるよう です。 #一応フルカラー環境なので、何もディザ使わなくても… -------------------------------------------------------- 付記: 前記バグは RGBImageFilter に由来する物と思い込んでいまし たが MemoryImageSource から createImage して得た Image でも起こるようです。