📄 drawpicturepanel.java
字号:
package disposeimage;
import java.awt.*;
import javax.swing.*;
import java.awt.image.*;
import java.awt.geom.*;
import java.awt.color.*;
/**
* <p>Title: DisposeImage</p>
* <p>Description: 应用Java 2D API实现图像的各种处理</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: 北京师范大学计算机系</p>
* @author 郑庆丰
* @version 1.0
*/
class DrawPicturePanel extends JPanel{
//定义缓冲区,bfdImage表示最终的要填充结果图,bfdImage1存放bfdImage的原图,
//bfdImage2存放bfdImage变化后的图形
private BufferedImage bfdImage;
private BufferedImage bfdImage1;
private BufferedImage bfdImage2;
//控制缩放比例
private double scaleX = 1.0;
private double scaleY = 1.0;
private Image image;
LookupTable lut;
//仿射变换器
AffineTransform transform = new AffineTransform();
//判断图像翻转的情况
boolean turn=true;
//构造函数
public DrawPicturePanel(){
loadImage();
createBufferedImage();
//设置Panel的宽高与图像相同
this.setSize(image.getWidth(this),image.getHeight(this));
}
public void loadImage(){
//从classes目录下加载图片
image = this.getToolkit().getImage(ClassLoader.getSystemResource("image.jpg"));
//存放图片的容器
MediaTracker mt = new MediaTracker(this);
//加载图片
mt.addImage(image,0);
try{
//判断图片是否完全加载
mt.waitForAll();
}catch(Exception err){
err.printStackTrace();
}
}
public void createBufferedImage(){
//创建缓冲区bfdImage1,并将bfdImage填充到bfdImage1中
bfdImage1 = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB);
Graphics2D g2D = bfdImage1.createGraphics();
g2D.drawImage(image,0,0,this);
//让bfdImage指向bfdImage1;
bfdImage = bfdImage1;
//创建缓冲区bfdImage2
bfdImage2 = new BufferedImage(image.getWidth(this),image.getHeight(this),BufferedImage.TYPE_INT_ARGB);
}
//变亮的方法
public void brightenLUT(){
short[] brighten = new short[256];
short pixelValue;
for (int i=0;i<256;i++){
//把源像素增加10个单位值
pixelValue = (short)(i+10);
if (pixelValue>255){
pixelValue = 255;
}
else if (pixelValue <0){
pixelValue =0;
}
brighten[i] = pixelValue;
}
lut = new ShortLookupTable(0,brighten);
LookupOp lop = new LookupOp(lut,null);
lop.filter(bfdImage1,bfdImage2);
bfdImage=bfdImage2;
}
public void darkenLUT(){
//查找表的数据数组
short[] darken = new short[256];
//定义像素值
short pixelValue;
for (int i=0;i<256;i++){
//把源像素减少10个单位值
pixelValue = (short)(i-10);
//像素的范围在0--255之间,控制范围
if (pixelValue>255){
pixelValue = 255;
}
else if (pixelValue <0){
pixelValue =0;
}
darken[i] = pixelValue;
}
//将变暗的像素点加入表中
lut = new ShortLookupTable(0,darken);
//根据查找表,创建查找过滤器
LookupOp lop = new LookupOp(lut,null);
//过滤图像
lop.filter(bfdImage1,bfdImage2);
bfdImage=bfdImage2;
}
//变灰的方法
public void grayImage(){
//创建灰化颜色转换器
ColorConvertOp cco = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY),null);
//将源缓冲区的处理结果放入新缓冲区
cco.filter(bfdImage1,bfdImage2);
bfdImage = bfdImage2;
}
public void transform(){
transform.setToScale(scaleX,scaleY);
//创建一个仿射变换过滤器
AffineTransformOp ato = new AffineTransformOp(transform,null);
//
bfdImage2.createGraphics().clearRect(0,0,bfdImage2.getWidth(this),bfdImage2.getHeight(this));
ato.filter(bfdImage1,bfdImage2);
bfdImage = bfdImage2;
}
//创建翻转的方法
public void turnBufferedImage(){
//创建一个与bfdImage1同样大小的bfdImage2
bfdImage2 = new BufferedImage(bfdImage1.getWidth(), bfdImage1.getWidth(),bfdImage1.getType());
//设置图像的数据缓冲
DataBuffer db1 = bfdImage1.getRaster().getDataBuffer();
DataBuffer db2 = bfdImage2.getRaster().getDataBuffer();
//用db2倒存db1的数据
for (int i=db1.getSize()-1,j=0;i>=0;i--,j++){
db2.setElem(j,db1.getElem(i));
}
//正面翻转到倒面的情况
if(turn){
bfdImage=bfdImage2;
turn=false;
//由倒面翻转到正面的情况
}else{
bfdImage=bfdImage1;
turn=true;
}
}
//创建update()的方法,用于执行重画时清屏
public void update(Graphics g){
//清屏的工作其实是用背景色填充屏幕
g.clearRect(0,0,this.getWidth(),this.getHeight());
//重画控件 (重画控件的原因见注释祥解)
this.paintComponent(g);
}
//重写父类JPanel中的paintComponent()方法 (重写方法的原因见注释祥解)
public void paintComponent(Graphics g){
//调父类的方法
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
//重画屏幕
g2d.drawImage(bfdImage,0,0,this);
}
//锐化的方法
public void sharpImage(){
bfdImage=null;
float[] data = {
-1.0f,-1.0f,-1.0f,
-1.0f,10.0f,-1.0f,
-1.0f,-1.0f,-1.0f
};
//创建卷积过滤器
Kernel kernel = new Kernel(3,3,data);
ConvolveOp co = new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);
//将存储源图像的缓冲区图像的数据经卷积过滤器处理后存入另一个缓冲
co.filter(bfdImage1,bfdImage2);
//处理后将bfdIamge2传给bfdImage
bfdImage = bfdImage2;
}
//模糊的方法
public void blurImage(){
float[] data = {
0.0625f,0.125f,0.0625f,
0.125f,0.125f,0.125f,
0.0625f,0.125f,0.0625f
};
//创建卷积过滤器
Kernel kernel = new Kernel(3,3,data);
ConvolveOp co = new ConvolveOp(kernel,ConvolveOp.EDGE_NO_OP,null);
//将存储源图像的缓冲区图像的数据经卷积过滤器处理后存入另一个缓冲
co.filter(bfdImage1,bfdImage2);
//处理后将bfdIamge2传给bfdImage
bfdImage = bfdImage2;
}
//还原的方法
public void resume(){
bfdImage=bfdImage1;
this.repaint();
}
//传值的方法
public void setscaleX(double scalex){
this.scaleX=scalex;
}
//传值的方法
public void setscaleY(double scaley){
this.scaleY=scaley;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -