画像を透過する方法(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)



・実行結果