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回かけると、以下のような画像になります。