二枚の画像を組み合わせてアルファチャネル付き画像を作成します。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして Alpha.java の名前で保存して下さい。
    // 二枚の画像を組み合わせてアルファチャネル付き画像を作成する    前田 稔
    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;
    import java.io.*;
    import javax.imageio.ImageIO;
    import java.awt.event.*;
    
    public class AlphaView extends JFrame
    {
        BufferedImage img= null;
        BufferedImage mask= null;
        BufferedImage vimg= null;
        int     mode= 0;
        Color   color1;
    
        // Main
        public static void main(String args[])
        {   new AlphaView();  }
    
        // Constructor
        public AlphaView()
        {   super("アルファチャネル付き画像を作成");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(520, 300);
            color1 = new Color(100, 110, 120);
            addMouseListener(new inMouseListener());
            img= loadImage("C:\\DATA\\Test\\ffx2s.jpg");
            mask= loadImage("C:\\DATA\\Test\\ffx2s_a.bmp");
            vimg= AlaphImg(img, mask);
            setVisible(true);
        }
    
        public void paint(Graphics g)
        {   super.paint(g);
            g.setColor(color1);
            g.fillRect(0,0,520,300);
            switch(mode)
            {   case 0:
                    if (img!=null)  g.drawImage(img,20,40,this);
                    break;
                case 1:
                    if (mask!=null) g.drawImage(mask,20,40,this);
                    break;
                default:
                    if (vimg!=null) g.drawImage(vimg,20,40,this);
                    break;
            }
        }
    
        // MouseListener
        class inMouseListener extends MouseAdapter
        {   public void mouseClicked(MouseEvent e)
            {   mode= (mode+1)%3;
                repaint();
            }
        }
    
        // BufferedImage の入力
        public static BufferedImage loadImage(String fileName)
        {   InputStream is = null;
            try
            {   is = new FileInputStream(fileName);
                BufferedImage img = ImageIO.read(is);
                return img;
            }
            catch (IOException e)
            {   throw new RuntimeException(e);  }
            finally
            {   if (is != null)
                    try { is.close(); }
                    catch (IOException e) { return null; }
            }
        }
    
        // 二枚の画像を組み合わせてアルファチャネル付き画像を作成
        public BufferedImage AlaphImg(BufferedImage img, BufferedImage mask)
        {   int pixel;
            int width = img.getWidth();
            int height = img.getHeight();
    
            BufferedImage vimg= new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
            for(int y=0; y<height; y++)
            {   for(int x=0; x<width; x++)
                {   pixel = img.getRGB(x,y) & 0Xffffff;
                    pixel |= mask.getRGB(x,y)<<24;
                    vimg.setRGB(x,y,pixel);
                }
            }
            return vimg;
        }
    }
    
  2. 通常の画像とマスク画像を組み合わせてアルファチャネル付き画像を作成します。
    通常の画像と同じサイズのマスク画像を用意して下さい。
    "C:\\DATA\\Test\\ffx2s.jpg" が通常の画像で、"C:\\DATA\\Test\\ffx2s_a.bmp" がマスク画像です。
    マスク画像の青色(8bit)が、アルファチャネルに格納される値です。
    ffx2s_a.bmp は、BMP24 の白黒モードで作成した画像です。
    マウスをクリックすると三種類の画像が順に切り替わります。

プログラムの説明

  1. アルファチャネル付きの画像を作成するツールは少なく、仮に作成出来てもアルファチャネル付きでロードする方法が見つかりません。
    そこで通常の画像とアルファチャネルに設定するマスク画像を組み合わせてアルファチャネル付き画像を作成してみました。
    img が通常の画像で、mask が白黒256色モードのマスク画像です。
    vimg が組み合わせたアルファチャネル付きの画像です。
    mode で三種類の画像の内、どの画像を描画するかを指定します。
        BufferedImage img= null;
        BufferedImage mask= null;
        BufferedImage vimg= null;
        int     mode= 0;
        
  2. BufferedImage に通常の画像とアルファチャネル用の画像を入力します。
    vimg= AlaphImg(img, mask); で二枚の画像を組み合わせて、アルファチャネル付きの画像を作成します。
        // Constructor
        public AlphaView()
        {   super("アルファチャネル付き画像を作成");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(520, 300);
            color1 = new Color(100, 110, 120);
            addMouseListener(new inMouseListener());
            img= loadImage("C:\\DATA\\Test\\ffx2s.jpg");
            mask= loadImage("C:\\DATA\\Test\\ffx2s_a.bmp");
            vimg= AlaphImg(img, mask);
            setVisible(true);
        }
        
  3. paint() メソッドでは mode に従って三種類の画像を描画します。
        public void paint(Graphics g)
        {   super.paint(g);
            g.setColor(color1);
            g.fillRect(0,0,520,300);
            switch(mode)
            {   case 0:
                    if (img!=null)  g.drawImage(img,20,40,this);
                    break;
                case 1:
                    if (mask!=null) g.drawImage(mask,20,40,this);
                    break;
                default:
                    if (vimg!=null) g.drawImage(vimg,20,40,this);
                    break;
            }
        }
        
  4. マウスのクリックで mode を 0,1,2,0, ... の順に切り替えます。
        // MouseListener
        class inMouseListener extends MouseAdapter
        {   public void mouseClicked(MouseEvent e)
            {   mode= (mode+1)%3;
                repaint();
            }
        }
        
  5. 二枚の画像を組み合わせてアルファチャネル付き画像を作成する AlaphImg() メソッドです。
    画像サイズを取得して new BufferedImage() でアルファチャネル付き画像領域(TYPE_4BYTE_ABGR)を生成します。
    ピクセルは、先頭から 24〜31= アルファ成分、16〜23= 赤色成分、8〜15= 緑色成分、0〜7= 青色成分で構成されます。
    ピクセル毎に通常画像の RGB とマスク画像の B(アルファ成分に使う青色)を組み合わせて格納します。
    マスク画像は白黒なので、RGB のどれを取っても同じ値です。
    vimg.setRGB(x,y,pixel); で vimg にピクセルを設定しています。
        // 二枚の画像を組み合わせてアルファチャネル付き画像を作成
        public BufferedImage AlaphImg(BufferedImage img, BufferedImage mask)
        {   int pixel;
            int width = img.getWidth();
            int height = img.getHeight();
    
            BufferedImage vimg= new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
            for(int y=0; y<height; y++)
            {   for(int x=0; x<width; x++)
                {   pixel = img.getRGB(x,y) & 0Xffffff;
                    pixel |= mask.getRGB(x,y)<<24;
                    vimg.setRGB(x,y,pixel);
                }
            }
            return vimg;
        }
        

超初心者のプログラム入門(Java2)