Javaで画像処理(その2)
前回のサンプルにグレイフィルタ、色調反転フィルタ、ガンマフィルタを追加する。
■ソースコード
前回のソースコードのcreateMenuBarメソッドを以下のように書き換える。
private JMenuBar createMenuBar(){ JMenuBar bar=new JMenuBar(); JMenu menu=new JMenu("File"); bar.add(menu); JMenuItem open=new JMenuItem("Open"); open.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { File f=getFile(JFileChooser.OPEN_DIALOG); if(f==null)return; try{ Image im=ImageIO.read(f); canvas.setBaseImage(im); }catch(IOException e){ JOptionPane.showMessageDialog( canvas,e.getMessage(),"Info", JOptionPane.WARNING_MESSAGE); } } }); menu.add(open); JMenuItem save=new JMenuItem("Save"); save.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { File f=getFile(JFileChooser.SAVE_DIALOG); if(f==null)return; try{ ImageIO.write(canvas.getImage(), "png", f); }catch(IOException e){ JOptionPane.showMessageDialog( canvas,e.getMessage(),"Info", JOptionPane.WARNING_MESSAGE); } } }); menu.add(save); JMenuItem exit=new JMenuItem("Exit"); menu.addSeparator(); menu.add(exit); JMenu filter=new JMenu("Filter"); JMenuItem gray=new JMenuItem("Gray"); filter.add(gray); gray.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { RGBImageFilter fil=new RGBImageFilter(){ @Override public int filterRGB(int x, int y, int rgb) { super.canFilterIndexColorModel=true; int r=(rgb>>16&0xff); int g=(rgb>>8&0xff); int b=(rgb&0xff); r=(r+g+b)/3; int ret=(255<<24)+(r<<16)+(r<<8)+r; return ret; } }; canvas.setBaseImage( applicateFilter(canvas.getImage(),fil,canvas)); fil=null; } }); JMenuItem border=new JMenuItem("Reverse"); filter.add(border); border.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { RGBImageFilter fil=new RGBImageFilter(){ @Override public int filterRGB(int x, int y, int rgb) { super.canFilterIndexColorModel=true; int t,r,g,b; t=(rgb>>24&0xff); r=(rgb>>16&0xff); g=(rgb>>8&0xff); b=(rgb&0xff); r=255-r; g=255-g; b=255-b; int ret=(t<<24)+(r<<16)+(g<<8)+b; return ret; } }; canvas.setBaseImage( applicateFilter(canvas.getImage(),fil,canvas)); fil=null; } }); JMenuItem ganma=new JMenuItem("Ganma"); filter.add(ganma); ganma.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent arg0) { final double ganma=0.5; ImageFilter fil=new RGBImageFilter(){ @Override public int filterRGB(int x, int y, int rgb) { super.canFilterIndexColorModel=true; int t,r,g,b; t=(rgb>>24&0xff); r=(int)(255*Math.pow( ((double)(rgb>>16&0xff)/255),1/ganma)); g=(int)(255*Math.pow( ((double)(rgb>>8&0xff)/255),1/ganma)); b=(int)(255*Math.pow( ((double)(rgb&0xff)/255),1/ganma)); int ret=(t<<24)+(r<<16)+(g<<8)+b; return ret; } }; canvas.setBaseImage( applicateFilter(canvas.getImage(),fil,canvas)); fil=null; } }); bar.add(filter); return bar; }
■実行結果
前回の元画像にリバースフィルタをかけ、次いでガンマフィルタを2回かけると、以下のような画像になります。