imageprocessingapplet.java

来自「java的书上例子」· Java 代码 · 共 332 行

JAVA
332
字号
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.io.*;
import java.applet.Applet;
import java.awt.color.*;

/** 一个对图象进行处理的小应用程序 
  * @作者:尉哲明
  * @日期:2001年5月 */

/** JApplet类 */
public class ImageProcessingApplet extends JApplet implements ActionListener
{
	private JComboBox comboBox;
	static ImageProcessingPanel panel;
	BufferedImage image;
	
	/** init()方法 */	
	public void init()
	{
		Container contentPane=getContentPane();
		
		panel=new ImageProcessingPanel(); //定义用于显示和处理图像的面板
		contentPane.add(panel,"Center");
		comboBox=new JComboBox();//创建一个下拉式菜单,可选择对图像进行处理
		
		comboBox.addItem(new OrderRotate());//该选项对图像进行顺时针旋转
		comboBox.addItem(new ConverseRotate());//该选项对图像进行逆时针旋转
		comboBox.addItem(new LeftAndUpTranslate());//图像向左和向上平移
		comboBox.addItem(new RightAndDownTranslate());//图像向右和向下平移
		comboBox.addItem(new Contract()); //该选项使图像按比例缩小
		comboBox.addItem(new Expand());  //该选项使图像按比例放大
		comboBox.addItem(new LeftAndUpShear());//该两个选项对图像进行剪切
		comboBox.addItem(new RightAndDownShear());
		comboBox.addItem(new Inverse()); //使图像倒转
		comboBox.addItem(new Blur()); //使图像模糊
		comboBox.addItem(new EdgeDetect()); //该选项执行边界检测
		comboBox.addItem(new Brighten()); //加亮图像
		comboBox.addItem(new ReverseDisplay()); //反向显示
		comboBox.addItem(new ColorConvert()); //对图像进行颜色空间的转换
		
		comboBox.addActionListener(this);
		contentPane.add(comboBox,"North");
		
		String name="pisa.jpg";
		Image loadedImage = getImage(getCodeBase(),name);
      	image=new LoadImage().load(loadedImage);//加载图像并写入缓冲图像中
   		panel.redraw(image); //显示缓冲图像
	}// init()方法结束
	
	/** 对下拉式菜单的动作事件处理方法 */
	public void actionPerformed(ActionEvent evt)
    {
		ImageProcessing source = (ImageProcessing)comboBox.getSelectedItem();
    	if(image!=null)
		{
	  		image=source.imageFilter(panel,image);//对图像进行处理
			panel.redraw(image); //显示被处理后的图像		
      	}
   	}//actionPerformed()方法结束
}// ImageProcessingApplet类定义结束

/** 定义图像处理面板类 */
class ImageProcessingPanel extends JPanel 
{
	private BufferedImage image;
    
	/** 图像处理面板组件的paintComponent()方法 */
	public void paintComponent(Graphics g)
   	{
		super.paintComponent(g);
      	if (image != null)
        	g.drawImage(image, 0, 0, null);
   	}//paintComponent()方法结束

	/** 该方法用来显示加载或处理后的图象 */
   	public void redraw(BufferedImage image)
   	{
   		this.image=image;
		repaint();
   	}//redraw()方法结束
} // ImageProcessingPanel类定义结束

/** 定义加载图像类 */
class LoadImage 
{

	/** 该方法加载图像并写入缓冲图像中 */
	public BufferedImage load(Image loadedImage)
   	{ //下面4行语句加载图像
		MediaTracker tracker = new MediaTracker(ImageProcessingApplet.panel);
      	tracker.addImage(loadedImage, 0);
      	try { tracker.waitForID(0); }
      	catch (InterruptedException e) {}
        //下面5行将加载的图像写入缓冲图像image中
      	BufferedImage image = new BufferedImage(loadedImage.getWidth(null),loadedImage.getHeight(null), BufferedImage.TYPE_INT_RGB);
      	Graphics2D g2 = image.createGraphics();
      	g2.drawImage(loadedImage, 0, 0, null);
      	return image;
	}//load()方法结束
}// LoadImage类定义结束

/** 该抽象类定义图像处理操作 */  
abstract class ImageProcessing
{
	BufferedImage filteredImage;//定义处理后的缓冲图像对象
	
	/** 图像处理操作方法imageFilter(),对img进行操作 */
	public abstract BufferedImage imageFilter(JPanel panel,BufferedImage img); 

	/** 该方法为能在下拉式菜单中显示类名而定义 */
	public String toString() 
	{
		return getClass().getName();
	}
}// ImageProcessing抽象类定义结束

/** 该类定义对图像的缩小操作 */   
class Contract extends ImageProcessing
{ 
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform = AffineTransform.getScaleInstance(0.5,0.5);//缩小一半
      	BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
		filteredImage = new BufferedImage(image.getWidth()/2, image.getHeight()/2,image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// Contract类定义结束

/** 该类定义对图像的放大操作 */
class Expand extends ImageProcessing
{
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform = AffineTransform.getScaleInstance(2,2);//放大一倍
      	BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
		filteredImage = new BufferedImage(image.getWidth()*2, image.getHeight()*2,image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// Expand类定义结束

/** 该类定义对图像的倒转操作 */
class Inverse extends ImageProcessing
{
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform=null;
		try
		{
			transform = new AffineTransform().createInverse();
		}catch(NoninvertibleTransformException e)
		{
		}
		
		if (transform!=null)
		{
      		BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
			filteredImage = new BufferedImage(image.getWidth(), image.getHeight(),image.getType());  
			op.filter(image, filteredImage);
      		return filteredImage;
		}
		else
			return image;
   	}
}// Inverse类定义结束

/** 该类定义对图像的顺时针旋转操作 */
class OrderRotate extends ImageProcessing
{
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform = AffineTransform.getRotateInstance(Math.toRadians(20),image.getWidth() / 2, image.getHeight() / 2);
		//顺时针旋转20度 
      	BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
		filteredImage = new BufferedImage(panel.getWidth(), panel.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// OrderRotate类定义结束

/** 该类定义对图像的反时针旋转操作 */
class ConverseRotate extends ImageProcessing
{
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform = AffineTransform.getRotateInstance(Math.toRadians(-20),image.getWidth() / 2, image.getHeight() / 2);
		//反时针旋转20度
      	BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
		filteredImage = new BufferedImage(panel.getWidth(), panel.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// ConverseRotate类定义结束

/** 该类定义对图像的左上方向剪切操作 */
class LeftAndUpShear extends ImageProcessing
{
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform = AffineTransform.getShearInstance(0.1, 0.1);
      	BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
		filteredImage = new BufferedImage(image.getWidth(), image.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// LeftAndUpShear类定义结束

/** 该类定义对图像的右下方向剪切操作 */
class RightAndDownShear extends ImageProcessing
{
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform = AffineTransform.getShearInstance(-0.1, -0.1);
      	BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
		filteredImage = new BufferedImage(image.getWidth(), image.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// RightAndDownShear类定义结束

/** 该类定义对图像的向右下方向平移操作 */
class RightAndDownTranslate extends ImageProcessing
{
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform = AffineTransform.getTranslateInstance(image.getWidth() / 5, image.getHeight() / 5);
      	BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
		filteredImage = new BufferedImage(panel.getWidth(), panel.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// RightAndDownTranslate类定义结束

/** 该类定义对图像的向左上方向平移操作 */
class LeftAndUpTranslate extends ImageProcessing
{
	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		AffineTransform transform = AffineTransform.getTranslateInstance(-image.getWidth() / 5, -image.getHeight() / 5);
      	BufferedImageOp op = new AffineTransformOp(transform,AffineTransformOp.TYPE_BILINEAR);
		filteredImage = new BufferedImage(panel.getWidth(), panel.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// LeftAndUpTranslate类定义结束

/** 该类定义图像的模糊操作 */
class Blur extends ImageProcessing
{
   	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
     	float weight = 1.0f/9.0f;
      	float[] elements = new float[9];
      	for (int i = 0; i < 9; i++)
         	elements[i] = weight;
      	Kernel kernel = new Kernel(3, 3, elements);
      	ConvolveOp op = new ConvolveOp(kernel);
		filteredImage = new BufferedImage(image.getWidth(), image.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// Blur类定义结束

/** 该类定义图像的边界检测操作 */	
class EdgeDetect extends ImageProcessing
{
   	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
     	float[] elements =
         	{  
				0.0f, -1.0f, 0.0f,
            	-1.0f,  4.f, -1.0f,
            	0.0f, -1.0f, 0.0f
         	};
      	Kernel kernel = new Kernel(3, 3, elements);
      	ConvolveOp op = new ConvolveOp(kernel);
		filteredImage = new BufferedImage(image.getWidth(), image.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// EdgeDetect类定义结束

/** 该类定义增亮图像的操作 */	
class Brighten extends ImageProcessing
{
   	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
     	float a = 1.5f;
      	float b = -20.0f;
      	RescaleOp op = new RescaleOp(a, b, null);
		filteredImage = new BufferedImage(image.getWidth(), image.getHeight(),image.getType());  
		op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// Brighten类定义结束

/** 该类定义图像的反向显示操作 */	
class ReverseDisplay extends ImageProcessing
{
   	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
     	byte negative[] = new byte[256];
      	for (int i = 0; i < 256; i++)
         	negative[i] = (byte)(255 - i);
      	ByteLookupTable table = new ByteLookupTable(0, negative);
      	LookupOp op = new LookupOp(table, null);
		filteredImage = new BufferedImage(image.getWidth(), image.getHeight(),image.getType());
	  	op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// ReverseDisplay类定义结束

/** 该类定义图像的颜色空间转换操作 */
class ColorConvert extends ImageProcessing
{ 
   	public BufferedImage imageFilter(JPanel panel,BufferedImage image)
   	{
		ColorModel model = image.getColorModel();
		ColorSpace src = model.getColorSpace();
		ColorSpace dst = ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB);
		ColorConvertOp op = new ColorConvertOp(src,dst,null);
		filteredImage = new BufferedImage(image.getWidth(), image.getHeight(),image.getType());
	  	op.filter(image, filteredImage);
      	return filteredImage;
   	}
}// ColorConvert类定义结束

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?