Java图像处理

在开发应用程序时,为了使程序界面美观,可以为应用程序窗口添加背景图片,方法是通过Java的绘图技术在控件上绘制图像,并将带有图片的控件添加到窗体上,运行程序,就可以看到在窗体显示的图片。跟图形的操作类似,在图像处理中我们也是通过重写JComponent类的paint()方法来实现对图像的各种操作的。下面是用到的一些方法的定义

public abstract boolean drawImage(Image img,int x,int y,ImageObserver observer);//绘制图像
//参数img是需要绘制的图像对象,x、y是绘制顶点的坐标,observer是图像的观察者,一般是绘制图像的控件

public abstract boolean drawImage(Image img,int x,int y,int width,int height,ImageObserver observer);//按给定大小绘制图像
//比上一个方法多出的width和height分别是图像的宽和高,通过这两个参数,可以实现对图像的缩放操作

public abstract boolean drawImage(Image img,int dx1,int dy1,int dx2,int dy2,int sx1,int sy1,int sx2,int sy2,ImageObserver observer);//翻转图像
//参数dx1、dy1、dx2、dy2分别是目标矩形的第1、2个角的坐标;sx1、sy1、sx2、sy2是源矩形第1、2个角的坐标
//通过互换drawImage()方法中源矩形第1个角和第2个角的x坐标,可以实现图像的水平翻转;通过互换drawImage()方法中源矩形第1个角和第2个角的y坐标,可以实现图像的垂直翻转;



//以下方法是Graphics2D类的方法,即在重写paint()方法时要将Graphics参数g转换为Graphics2D再进行调用
public abstract void rotate(double theta);//旋转图像
//theta是旋转的角度,以弧度为单位

public abstract void shear(double shx,double shy);//倾斜图像
//shx、shy是正x、y轴方向移动坐标的乘数,它可以作为其y、x坐标的函数

public BufferedImage createScreenCapture(Rectangle screenRect);//裁剪图片
//screenRect是屏幕上被截取的矩形区域,返回值即是从屏幕上截取的缓冲图像对象

public final BufferedImage filter(BufferedImage src,BufferedImage dst);//调整图片的亮度
//src是要过滤的源BufferedImage对象;dst是目标BufferedImage对象,或null

public ColorConvertOp(ColorSpace srcCspace,ColorSpace dstCspace,RenderingHints hints);//转换彩色图片为灰度图片
//srcCspace是原颜色空间对象;dstCspace是目标颜色空间对象;hints是用于控制颜色转换的RenderingHints对象,或null

public Image createImage(ImageProducer producer);//使用像素值生成图像
//producer是图像生成器,返回值是该方法执行成功返回一个Image对象

下面是使用上述方法的一些例子

class DrawImagePanel extends JPanel{	//绘制图像
		public void paint(Graphics g){
				g.drawImage(img,0,0,this);	//绘制图像
		}
}

class ZoomImagePanel extends JPanel{		//绘制指定大小的图片
		public void paint(Graphics g){
			g.clearRect(0,0,this.getWidth(),this.getHeight());
			imgWidth = img.getWidth(this);
			imgHeight = img.getHeight(this);		//获取图片的宽高
			float value = slider.getValue();		//滑块组件的取值
			newW = (int)(imgWidth*value/100);
			newH = (int)(imgHeight*value/100);				//计算图片缩放后的宽高
			g.drawImage(img,0,0,newW,newH,this);		//绘制制定大小的图片
	}
}

class PartImagePanel extends JPanel{	//翻转图像
		public void paint(Graphics g){
			g.clearRect(0,0,this.getWidth(),this.getHeight());
			g.drawImage(img,dx1,dy1,dx2,dy2,dx2,dy1,dx1,dy2,this);	//水平翻转
		}
}

class RotatePanel extends JPanel { //旋转图片
	public void paint(Graphics g){
		Graphics2D g2 = (Graphics2D)g;
		g2.drawImage(img,80,10,260,150,this);
		g2.rotate(Math.toRadians(10));
		g2.drawImage(img,80,10,260,150,this);
		g2.rotate(Math.toRadians(10));
		g2.drawImage(img,80,10,260,150,this);
	}
}

class ShearImagePanel extends JPanel {	//倾斜图片
	public void paint(Graphics g){
		Graphics2D g2 = (Graphics2D)g;
		g2.shear(0.5,0);
		g2.drawImage(img,10,20,220,160,this);
	}
}

class CutImagePanel extends JPanel {		//裁剪图片
	public void paint (Graphics g){
		Graphics2D g2 = (Graphics2D)g;
		g2.drawImage(img,0,0,this.getWidth(),this.getHeight(),this);
		g2.setColor(Color.WHITE);
		if(flag){
			float[] arr = {5.0f};
			BasicStroke stroke = new BasicStroke(1,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL,1.0f,arr,0);
			g2.setStroke(stroke);
			g.clearRect(0,0,this.getWidth(),this.getHeight());
			g.drawImage(createScreenCapture(g2.drawRect(pressPanelX,pressPanelY,releaseX-pressX,releaseY-pressY);),0,0,releaseX-pressX,releaseY-pressY,this);
		}
	}
}

class CreateImagePanel extends JPanel{ //使用像素值生成图像
	public void paint(Graphic g){
		int w=300,h=220;
		int pix[]=new int[w*h];
		int index = 0;
		for(int y=0;y<h;y++){
			int red=(y*255)/(h-1);
			for(int x =0;x<w;x++){
				int blue=(x*255)/(w-1);
				pix[index++]=(255<<24)|(red<<16)blue;
			}
		}
		ImageProducer imageProducer = new MemoryImageSource(w,h,pix,0,w);
		Image img=createImage(imageProducer);
		g.drawImage(img,0,0,getWidth(),getHeight(),this);
	}
}
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值