图形处理规划

图形处理规划

界面:

  • 画图区
  • 功能区

监听器:

  • 功能的实现
  • 调用底层的图像处理的算法

图像处理类:

  • 图像的转数组
  • 图像处理算法
功能:
  • 基础滤镜处理 - R G B配置
  • 画图功能 - 改变图片部分区域
  • 图片 存储 打开
  • 图层 - 撤回 录制 回放
  • 缩放 矩阵线性插值 矩阵映射
  • 卷积 - 哈哈镜 高斯模糊 锐化
  • 二维码编码生成
  • 以图搜图
  • 视频处理

点击按钮 调用图片处理效果

  1. 把图片转成二维数组:
  2. 图片 --> BufferedImage --> 二维数组
  3. ImageIO.read();
  4. BufferedImage – 缓冲图片类
  5. Graphics 绘制像素
//异	常:	
try {// 捕获异常
BufferedImage buffimg = ImageIO.read(file);
} catch (IOException e) {// try 块中如果出现异常 就会执行 catch中的内容e.printStackTrace();
}

二维数组:还是一维数组 – 内存条 内存是线性结构

int[] arr = new int[10]; {0,0,0,0,0,0,0,0} int[][] arr2 = new int[10][10];
int[][] arr3={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};
arr3.length -- 有多少个一维数组arr3[i].length 每个一维数组有多少个元素int[] arr1_1 = arr3[2];
{0,0,0,0
0,0,0,0
0,0,0,0
}

完善图像处理效果

/**
*ImageUI :界面
*btnstrs:按钮字符串数组
*imageListener: 图像监听器
*addButtons(); 按钮的初始化创建方法
*initUI(); 界面初始化方法
*/
public class ImageUI extends JFrame{


String[] btnstrs = new String[]{
"原图","灰度","二值化","马赛克","油画","轮廓检测","撤回", "画笔","放大","缩小","RGB"
};
// 图像监听器实例
ImageListener imageListener = new ImageListener ();

// 封装的按钮添加方法
public void addButtons(JFrame jf, ActionListener al){ Dimension dim =	new Dimension(120,55);
Font font = new Font ("黑体",Font.BOLD,22);
for(int i = 0; i < btnstrs.length; i++){ JButton btn = new JButton (btnstrs[i]); btn.addActionListener (al); btn.setBackground (Color.WHITE); btn.setFont (font); btn.setPreferredSize (dim);
jf.add (btn);
}


}
// 图像界面初始化
public void initUI(){
setTitle ("图形图像处理编程"); setSize (800,800);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); setLayout (new FlowLayout ()); setLocationRelativeTo (null); addButtons(this,imageListener);
setVisible (true);

// 在可视化之后获取Graphics Graphics g = getGraphics (); imageListener.setGraphics(g);
}

public static void main(String[] args){ new ImageUI ().initUI ();
}

}



package image.zyf0926;


import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener;

/**
*ImageListener:创建一个类实现(implements)接口
*imageEff: 图像处理对象
*构造方法 传值	封装的get set
*
*
*/


public class ImageListener implements ActionListener{ ImageEff imageEff = new ImageEff ("img/img02.jpeg");

Graphics g;
public void setGraphics(Graphics g){this.g = g;}



public void actionPerformed(ActionEvent e){ System.out.println (e.getActionCommand ());
// 获取按钮上的字符串 来判断需要执行什么功能
String btnstr = e.getActionCommand();// 获取按钮对象的字符串

// 根据不同按钮的响应,调用不同的处理方法 显示不同类型的图片
if(btnstr.equals (" 原 图 ")){ imageEff.drawImage_01 (g);

}else if(btnstr.equals ("灰度")){ imageEff.drawImage_02(g);
}else if(btnstr.equals ("马赛克")){ imageEff.drawImage_03(g);
}else if(btnstr.equals ("二值化")){ imageEff.drawImage_04(g);
}else if(btnstr.equals ("油画")){ imageEff.drawImage_05(g);
}else if(btnstr.equals ("轮廓检测")){ imageEff.drawImage_06(g);
}
}

}



package image.zyf0926;


import javax.imageio.ImageIO; import java.awt.*;
import java.awt.image.BufferedImage; import java.io.File;
import java.io.IOException; import java.util.Random;

/**
*ImageEff 图片处理类
*imgarr 图片的二维数组
*ImageEff(String path) 根据路径 生成图片的二维数组
*/
public class ImageEff{ int[][] imgarr;
//	int[][][][][][][][][][][][][][] arr;
ImageEff(String path){

imgarr =	imgeToArray(path);
}
/**
* 把图片转成二维数组
*/
public int[][] imgeToArray(String path){
// 先创建文件对象 :
File file = new File(path);
// 声明一个BUfferedImage的引用名BufferedImage buffimg=null; try {
// 将文件对象读为 缓冲图片对象
buffimg	=	ImageIO.read(file);
} catch (IOException e) { e.printStackTrace ();
}
// 根据图片对象进行初始化二维数组int w = buffimg.getWidth (); int h = buffimg.getHeight ();
int[][] imgData = new int[w][h];

// 将 buffimg 中的RGB值存入数组中
for(int i = 0; i < imgData.length; i++){ for(int j = 0; j < imgData[0].length; j++){
imgData[i][j] = buffimg.getRGB(i,j);
}
}
// 返回数组
return imgData;
}

/**
*绘制图片特效
*马赛克 原图 ....
*/
public void drawImage_01(Graphics g){ System.out.println ("绘制原图!!!");

for(int i = 0; i < imgarr.length; i++){ for(int j = 0;	j< imgarr[i].length; j++){
int rgb = imgarr[i][j];
Color color = new Color (rgb); g.setColor (color); g.fillRect (i,j+120,1,1);
}
}
}

/**
*灰度
*@param g
*/
public void drawImage_02(Graphics g){ System.out.println ("绘制灰度图 !!!");

for(int i = 0; i < imgarr.length; i++){ for(int j = 0;	j< imgarr[i].length; j++){
int rgb = imgarr[i][j];

//		Color color = new Color (rgb); int red = (rgb>>16)&0xFF;
int green = (rgb>>8)&0xFF; int blue = (rgb>>0)&0xFF;

int gray = (red+green+blue)/3;
Color color = new Color (gray,gray,gray); g.setColor (color);
g.fillRect (i,j+120,1,1);
}
}
}

/**
*马赛克
*/
public void drawImage_03(Graphics g){ for(int i = 0; i < imgarr.length; i+=8){
for(int j = 0;	j< imgarr[i].length; j+=8){ int rgb = imgarr[i][j];
Color color = new Color (rgb); g.setColor (color); g.fillOval (i,j+120,8,8);
}
}
}

/**
*二值化
*/
public void drawImage_04(Graphics g){ for(int i = 0; i < imgarr.length; i++){
for(int j = 0;	j< imgarr[i].length; j++){ int rgb = imgarr[i][j];
int red = (rgb>>16)&0xFF; int green = (rgb>>8)&0xFF; int blue = (rgb>>0)&0xFF;
int gray = (red+green+blue)/3; if(gray<80){
g.setColor(Color.BLACK);
}else{
g.setColor (Color.WHITE);
}
g.fillRect (i,j+120,1,1);
}
}
}

// 油画
// 随机数 Random
public void drawImage_05(Graphics g){ Random rannum = new Random ();
int num =	rannum.nextInt (100)-50; for(int i = 0; i < imgarr.length; i+=5){
for(int j = 0;	j< imgarr[i].length; j+=5){ int rgb = imgarr[i][j];
Color color = new Color (rgb); g.setColor (color);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值