画像を透過する方法(JDK1.4.1)
・ソース
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
/**
* <pre>
* 画像を透過させるサンプル。
* メインクラス。
* </pre>
*/
public class Transparent{
public static void main(String[] args){
TransFrame tf = new TransFrame();
tf.show();
}
}
/**
* <pre>
* 画像を透過させるサンプル。
* フレームクラス。
* </pre>
*/
class TransFrame extends Frame{
/** 透過指定色(from) */
private final int FROM = 0x000000;
/** 透過指定色(to) */
private final int TO = 0x050505;
/** 透明度 */
private final int FREQUENCY = 0;
/** 画像のファイル名 */
private final String fileName = "image.png";
/** 表示する画像 */
private Image image;
/**
* コンストラクタ。
*/
public TransFrame(){
// Window を閉じる為のリスナ
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
// サイズ設定
setSize(150, 150);
// 背景色設定(薄い緑)
setBackground(new Color(192, 255, 192));
// 画像読み込み
Toolkit tk = Toolkit.getDefaultToolkit();
image = tk.getImage(fileName);
// 透過処理
TransparentFilter filter = new TransparentFilter(FROM, TO, FREQUENCY);
FilteredImageSource fis = new FilteredImageSource(image.getSource(), filter);
image = createImage(fis);
// 画像描画
repaint();
}
/**
* 描画処理。
* @param g Graphicsオブジェクト
*/
public void paint(Graphics g){
g.drawImage(image, 40, 40, this);
}
}
/**
* <pre>
* 画像を透過させるサンプル。
* 透過フィルタクラス。
* 色はint型で表され、上から
* 1バイト目 透明度
* 2バイト目 赤
* 3バイト目 緑
* 4バイト目 青
* となっている為、透明にするにはint型の上から1バイトを0にすれば良い。
* </pre>
*/
class TransparentFilter extends RGBImageFilter{
/** 赤部分マスク */
private final int MASK_R = 0x00FF0000;
/** 緑部分マスク */
private final int MASK_G = 0x0000FF00;
/** 青部分マスク */
private final int MASK_B = 0x000000FF;
/** 透過範囲(from) */
private int from;
/** 透過範囲(to) */
private int to;
/** 透明度 */
private int frequency;
/**
* コンストラクタ
* @param from 透過対象色(from)
* @param to 透過対象色(to)
* @param frequency 透明度
*/
public TransparentFilter(int from, int to, int frequency){
this.from = from;
this.to = to;
this.frequency = frequency << 24;
canFilterIndexColorModel = true;
}
/**
* 透過処理
* @param x X座標
* @param y Y座標
* @param rgb 色
* @return 透過処理後RGB
*/
public int filterRGB(int x, int y, int rgb){
int color = rgb & 0x00FFFFFF;
// 透過対象色かどうかを判定し、対象外はそのまま返す
// 赤
if(((color & MASK_R) < (from & MASK_R)) ||
((to & MASK_R) < (color & MASK_R)))
return rgb;
// 緑
if(((color & MASK_G) < (from & MASK_G)) ||
((to & MASK_G) < (color & MASK_G)))
return rgb;
// 青
if(((color & MASK_B) < (from & MASK_B)) ||
((to & MASK_B) < (color & MASK_B)))
return rgb;
// 透明度で透過して返す
return (frequency | color);
}
}
・画像(image.png)
・実行結果