ページ 1 / 1
javaでの透過色処理
Posted: 2011年2月21日(月) 11:39
by dic
おもいっきりjavaですが、javaはあまり掲示板がないのでここで聞かせてください
javaで透過色の処理をしたいのです
下のように簡単なソースを書きました
当然、透過色指定もしてないのでそのまま表示されますが
javaではどうやって透過色の指定をするのでしょうか?
正確に言うとjava appletです
コード:
import java.awt.*;
import java.applet.*;
/*
<APPLET
CODE = image01.class
WIDTH = 500
HEIGHT = 150 >
</APPLET>
*/
public class image01 extends Applet
{
Image image;
Image image2;
public void init()
{
image = getImage( getDocumentBase(), "image.jpg" );
image2 = getImage( getDocumentBase(), "れいむ.jpg" );
}
public void paint( Graphics g )
{
g.drawImage( image, 10, 10, this );
g.drawImage( image2, 50, 50, this );
}
}
Re: javaでの透過色処理
Posted: 2011年2月21日(月) 12:40
by やんち
http://www13.plala.or.jp/kmaeda/java2/colorkey.htm
動作確認していませんが、参考になりそうなページを貼り付けておきます。
Javaで透過色処理をするには、いくつか方法があると思いますが、
「アルファブレンディング」をするか、「ビットマスク」をする。
と言うのが、一般的だと思います。
Re: javaでの透過色処理
Posted: 2011年2月21日(月) 12:50
by dic
透過でなく透明色ですね
C/C++だとできてるんですけど
javaではどうやるのかわからなくて
画像のように、背景の上に画像をのせるとして
こののせる画像の透明な色を指定する方法です
Re: javaでの透過色処理
Posted: 2011年2月21日(月) 13:21
by dic
>>やんちさん
リンク先のコードを使ってみました
そうしたら、一回だけ透明色ができたのですが
ソースをいじってたら透明にならなくなりました
javaのキャッシュがきいているのか、ソースが間違っているのかわからなくなりました
そこで、リンク先のコードを少し変更したところ
たしかに透明にする色の摘出には成功しているのですが
透明色に変更するという関数Transparentのところで、うまいぐあいに透明になってないみたいです
setRGB(x,y,0); で透明になるようですが 0はインデックスカラーか?何か?いじってたら
インデックスカラーのような気がしてきました
画像が青に変更になっているので、黒(Color(0,0,0))をとりだしているようですが
透明にセットするのが失敗しているようです
もしくは上のようにキャッシュがきいているかもしれないです
どこかミスっていないかアドバイスをいただけないでしょうか?
下がソースコードです
コード:
// 指定された色を透明にする
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import java.io.File;
import javax.imageio.ImageIO;
public class ColorKey extends JFrame
{
BufferedImage img = null;
String Name = "kishimz.gif";
//String Name = "C:\\DATA\\Test\\kishimz.bmp";
// Main
public static void main(String args[])
{ new ColorKey(); }
// Constructor
public ColorKey()
{ super("透明色");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 300);
try
{ img = ImageIO.read(new File(Name)); }
catch (Exception e)
{ e.printStackTrace();
img = null;
}
Transparent(img, new Color(0,0,0));
setVisible(true);
}
public void paint(Graphics g)
{ super.paint(g);
if (img!=null)
{ g.drawImage(img,20,40,this); }
}
// 透明にする
public static void Transparent(BufferedImage img, Color c)
{
int w = img.getWidth(); // Image の幅
int h = img.getHeight(); // Image の高さ
int t = c.getRGB(); // 透明色に変換する色のRGB値
//RGB値を0(透明色)に置換
for(int y = 0; y < h; y++)
{ for(int x = 0; x < w; x++)
{
if (img.getRGB(x,y)==t)
// img.setRGB(x,y,0);
img.setRGB(x,y,255);
}
}
}
}
Re: javaでの透過色処理
Posted: 2011年2月21日(月) 17:56
by ISLe
JPEGだと画像がぼけるのでカラーキーでの透過処理は無理だと思いますが。
GIFやPNGで透過情報を持った画像ならそのままGraphics#drawImageで透過します。
アルファチャンネルを持ったPNGもそのまま描画できると思います。
Re: javaでの透過色処理
Posted: 2011年2月21日(月) 19:48
by dic
>>ISLeさん
JPEGだとそうなんですか
いろいろやってみたところ おっしゃるとおり jpgの場合は無理でした
gifに変換するとできました
しかし、jpg -> gif と変換した画像を使ったのでちょっとあらい結果になりました
解決したのでコードをのせておきます
コード:
import java.awt.*;
import java.applet.*;
import java.awt.Image;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.File;
/*
<APPLET
CODE = image01.class
WIDTH = 500
HEIGHT = 150 >
</APPLET>
*/
public class image01 extends Applet
{
Image image;
Image image2;
BufferedImage img = null;
String Name = "れいむ.gif";
public void init()
{
image = getImage( getDocumentBase(), "image.jpg" );
image2 = getImage( getDocumentBase(), "れいむ.gif" );
setSize( 1024, 768 );
try
{
img = new BufferedImage( 250, 250, BufferedImage.TYPE_INT_ARGB );
img = ImageIO.read(new File(Name));
}
catch (Exception e)
{ e.printStackTrace();
img = null;
}
Transparent(img, new Color(1.0f,1.0f,1.0f));
setVisible(true);
int a = img.getTransparency();
if( a == BufferedImage.OPAQUE )
System.out.println( "完全に不透明であることが保証される (すべてのピクセルのアルファ値が 1.0) イメージデータを表現します。 " );
if( a == BufferedImage.BITMASK )
System.out.println( "完全に不透明 (アルファ値が 1.0) である、あるいは完全に透明 (アルファ値が 0.0) であることが保証されるイメージデータを表現します。 " );
}
public void paint( Graphics g )
{
g.drawImage( image, 10, 10, this );
g.drawImage( image2, 50, 50, this );
g.drawImage( img, 100, 100, this );
}
// 透明にする
public static void Transparent(BufferedImage img, Color c)
{
int w = img.getWidth(); // Image の幅
int h = img.getHeight(); // Image の高さ
int t = c.getRGB(); // 透明色に変換する色のRGB値
//RGB値を0(透明色)に置換
for(int y = 0; y < h; y++)
{ for(int x = 0; x < w; x++)
{ if (img.getRGB(x,y)==t) img.setRGB(x,y,0); }
}
}
}
Re: javaでの透過色処理
Posted: 2011年2月25日(金) 21:35
by dic
追加でいろんな形式で試してみました 結果
JPEG:透過されない(完全に不透明であることが保証される (すべてのピクセルのアルファ値が 1.0) イメージデータを表現します。)
GIF:透過される(完全に不透明 (アルファ値が 1.0) である、あるいは完全に透明 (アルファ値が 0.0) であることが保証されるイメージデータを表現します。)
PNG:透過されない(完全に不透明であることが保証される (すべてのピクセルのアルファ値が 1.0) イメージデータを表現します。)
BMP:透過されない(完全に不透明であることが保証される (すべてのピクセルのアルファ値が 1.0) イメージデータを表現します。)
とのデータがでました
ただ、PNG形式に関しては編集ソフトがOS付属のペイントだったのでアルファチャンネルの追加が
できなかったためかなと思ってます
Re: javaでの透過色処理
Posted: 2011年2月25日(金) 23:23
by ISLe
画像形式がサポートしているかどうかと実際に読み込んだ画像が透明情報を持っているかどうかは異なります。
JPEGとBMPは透過情報をサポートしていませんのでOPAQUEしか返しません。
GIFは透過マスク情報を持つことができますが持たないこともできますのでOPAQUEかBITMASKのいずれかを返す可能性があります。
PNGは透過マスク情報、アルファチャンネルを持つことができますが持たないこともできますのでOPAQUEかBITMASKかTRANSLUCENTのいずれかを返す可能性があります。
(追記)
Java 2 SEは公式にはJPEG,GIF,PNGしかサポートしてません。