« 透過PNG | Main | SQLite Java Wrapperのコンパイル »

2007.10.04

透過PNG - 8bitPNGで

 透過PNGがIE6では表示できない件に関して、8bit PNGなら表示できるとコメントをいただいたので、トライしてみました。
 悩んだのが、BufferedImageを初期化する際に、どのようなオプションを指定すればいいのか? 前回透過PNGを作成するときに使用したのはTYPE_INT_ARGBなのですが、これは違うってことで。

 で、いろいろと試した結果、たどり着いたのがjava.awt.image.IndexColorModelの使用。

package image;

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.image.IndexColorModel;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class PngTest {
 public static void main(String[] args) throws IOException {
  {
   BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_4BYTE_ABGR);
   create(image, "PNG", "testdata/test-1.png");
  }
  {
   BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB);
   create(image, "PNG", "testdata/test-2.png");
  }
  {
   BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_4BYTE_ABGR_PRE);
   create(image, "PNG", "testdata/test-3.png");
  }
  {
   BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_ARGB_PRE);
   create(image, "PNG", "testdata/test-4.png");
  }
  {
   BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_4BYTE_ABGR);
   create(image, "GIF", "testdata/test-1.gif");
  }
  {
   byte a[] = { (byte)0 , (byte)255, (byte)255, (byte)255 , (byte)255, (byte)255 };
   byte r[] = { (byte)0 , (byte)0, (byte)255, (byte)0 , (byte)0, (byte)255 };
   byte g[] = { (byte)0 , (byte)0, (byte)0 , (byte)255 , (byte)0, (byte)255 };
   byte b[] = { (byte)0 , (byte)0, (byte)0 , (byte)0 , (byte)255, (byte)255 };
   IndexColorModel icm = new IndexColorModel(8 , a.length , r , g , b , a);
   BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_BYTE_INDEXED, icm);
   create(image, "PNG", "testdata/test-5.png");
  }
 }
 public static void create(BufferedImage image, String format, String filename) throws IOException {
  Graphics2D g2d = image.createGraphics();
  g2d.setBackground(new Color(255, 255, 255, 0));
  g2d.setColor(new Color(255,0,0));
  g2d.fillRect(0, 0, 100, 10);
  g2d.setColor(new Color(0,255,0));
  g2d.fillRect(0, 90, 100, 10);
  g2d.setColor(new Color(0,0,255));
  g2d.fillRect(45, 45, 10, 10);
  g2d.setColor(new Color(255,255,255));
  g2d.drawLine(0,0,100,100);
  g2d.setColor(new Color(0,0,0));
  g2d.drawLine(0,100,100,0);
  ImageIO.write(image, format, new File(filename));
 }
}


って感じでいろいろな方法でBufferedImageを初期化するクラスを作ってテストしてみたところ、test-5.pngのみ、IE6でも問題なく透過状態で表示できました。ただ、IndexColorModelの詳細な使い方は理解できていません(苦笑)。使用可能なパレット(RGBあるいはARGB)を指定して初期化、従って、初期化の際にセットした色しか使用できないんですかね?

 しかし、こんな面倒な方法で処理するしかないんですかねぇ・・・もっといい方法があるような気はするのですが・・・。

 なお、参考にしたのは、http://wisdom.sakura.ne.jp/system/java/awt/Gjava40.htmlのサイトです。

#もしかして、IndexColorModelを使用すると、透過gifも問題なく表示できたりするんでしょうかね?

|

« 透過PNG | Main | SQLite Java Wrapperのコンパイル »

Java」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/16651905

Listed below are links to weblogs that reference 透過PNG - 8bitPNGで:

« 透過PNG | Main | SQLite Java Wrapperのコンパイル »