javaでの透過色処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

javaでの透過色処理

#1

投稿記事 by dic » 14年前

おもいっきり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 );
	}
}
添付ファイル
無題.JPG
無題.JPG (59.59 KiB) 閲覧数: 12450 回

やんち

Re: javaでの透過色処理

#2

投稿記事 by やんち » 14年前

http://www13.plala.or.jp/kmaeda/java2/colorkey.htm

動作確認していませんが、参考になりそうなページを貼り付けておきます。

Javaで透過色処理をするには、いくつか方法があると思いますが、
「アルファブレンディング」をするか、「ビットマスク」をする。
と言うのが、一般的だと思います。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: javaでの透過色処理

#3

投稿記事 by dic » 14年前

透過でなく透明色ですね
C/C++だとできてるんですけど
javaではどうやるのかわからなくて

画像のように、背景の上に画像をのせるとして
こののせる画像の透明な色を指定する方法です
添付ファイル
aaa.JPG
aaa.JPG (54.31 KiB) 閲覧数: 12434 回

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: javaでの透過色処理

#4

投稿記事 by dic » 14年前

>>やんちさん
リンク先のコードを使ってみました
そうしたら、一回だけ透明色ができたのですが
ソースをいじってたら透明にならなくなりました
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);
			}
        }
    }
}
添付ファイル
bbb.JPG
bbb.JPG (26.92 KiB) 閲覧数: 12424 回

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: javaでの透過色処理

#5

投稿記事 by ISLe » 14年前

JPEGだと画像がぼけるのでカラーキーでの透過処理は無理だと思いますが。

GIFやPNGで透過情報を持った画像ならそのままGraphics#drawImageで透過します。
アルファチャンネルを持ったPNGもそのまま描画できると思います。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: javaでの透過色処理

#6

投稿記事 by dic » 14年前

>>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);  }
        }
    }

}
添付ファイル
aaaaa.JPG
ゆっくり描画した結果がこれだよ!!!

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: javaでの透過色処理

#7

投稿記事 by dic » 14年前

追加でいろんな形式で試してみました 結果

JPEG:透過されない(完全に不透明であることが保証される (すべてのピクセルのアルファ値が 1.0) イメージデータを表現します。)
GIF:透過される(完全に不透明 (アルファ値が 1.0) である、あるいは完全に透明 (アルファ値が 0.0) であることが保証されるイメージデータを表現します。)
PNG:透過されない(完全に不透明であることが保証される (すべてのピクセルのアルファ値が 1.0) イメージデータを表現します。)
BMP:透過されない(完全に不透明であることが保証される (すべてのピクセルのアルファ値が 1.0) イメージデータを表現します。)

とのデータがでました
ただ、PNG形式に関しては編集ソフトがOS付属のペイントだったのでアルファチャンネルの追加が
できなかったためかなと思ってます

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: javaでの透過色処理

#8

投稿記事 by ISLe » 14年前

画像形式がサポートしているかどうかと実際に読み込んだ画像が透明情報を持っているかどうかは異なります。

JPEGとBMPは透過情報をサポートしていませんのでOPAQUEしか返しません。
GIFは透過マスク情報を持つことができますが持たないこともできますのでOPAQUEかBITMASKのいずれかを返す可能性があります。
PNGは透過マスク情報、アルファチャンネルを持つことができますが持たないこともできますのでOPAQUEかBITMASKかTRANSLUCENTのいずれかを返す可能性があります。

(追記)
Java 2 SEは公式にはJPEG,GIF,PNGしかサポートしてません。
添付ファイル
image.zip
GIF,PNGのサンプル画像ファイル
(5.31 KiB) ダウンロード数: 163 回

閉鎖

“C言語何でも質問掲示板” へ戻る