一、建立界面
二、建立监听器
三、读取图片
四、实现效果
·黑白化效果
·边缘化效果
·浮雕效果
·锐化效果
·镜像效果
·风景叠加效果
·沙画效果
·图片爆炸效果
·图片恢复效果
一、建立界面
建立界面便是建立一个类去继承JFrame类,然后写一个方法去完善界面内容,然后要实现菜单栏效果需要使用JMenuBar菜单条和JMenu菜单和JMenuItem菜单项。
public class DrawUI extends JFrame {
//创建监听器对象
DrawListener drawL = new DrawListener();
DrawListener1 drawL1 = new DrawListener1();
//显示界面的方法
public void showUI() {
//创建一个窗体对象
JFrame drawFrame = new JFrame();
drawFrame = this;
//设置窗体的名字、属性大小、位置、关闭的操作
drawFrame.setTitle("图像处理");
drawFrame.setSize(1000, 600);
drawFrame.setLocationRelativeTo(null);
drawFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置布局为流式布局
drawFrame.setLayout(new FlowLayout());
// JMenuBar是放菜单的母版,又称为菜单栏
JMenuBar menuBar = new JMenuBar();
// 将菜单栏对象放在窗体的菜单栏中
this.setJMenuBar(menuBar);
//创建第一个文件菜单
JMenu menu1 = new JMenu("文件");
menuBar.add(menu1);
//在文件菜单中增加菜单项
String[] arr = {"打开","保存"};
for(String str :arr){
JMenuItem menuItem = new JMenuItem(str);
menu1.add(menuItem);
menuItem.addActionListener(drawL);
}
//设置窗体可见
drawFrame.setVisible(true);
//获取Graphics
Graphics g = drawFrame.getGraphics();
//给监听器的属性赋值
drawL.g = g;
drawL1.g = g;
}
//主方法
public static void main(String[] args) {
//创建界面对象
DrawUI ui = new DrawUI();
//显示界面
ui.showUI();
}
界面加上菜单栏效果图
二、建立监听器
需要建立一个监听器的类实现ActionListener接口,然后在类里面写需要实现的方法,并改写actionPerformed方法,通过点击菜单栏实现不同效果。
public class DrawListener implements ActionListener {
Graphics g;
int rgb = 0;
BufferedImage img;
BufferedImage img1;
BufferedImage img2;
int data[][];
int data1[][];
JFileChooser chooser;
public void actionPerformed(ActionEvent e) {
//读取菜单项的文字
String action = e.getActionCommand();
switch (action) {
case "加载":
load();
break;
case "原画":
draw();
break;
}
}
}
三、读取图片
读取图片需要在监听器一开始建立JFileChooser文件选择器对象,通过此类的setFileFilter方法读取图片,然后建立BufferedImage带缓冲的图像类的对象,将图片缓存到缓冲区。
// 读取文件
public void open() {
// 指定从桌面打开
chooser = new JFileChooser(new File("C:\\Users\\11603\\Desktop\\蓝杰"));
// 文件过滤器
FileNameExtensionFilter filter = new FileNameExtensionFilter("JPG & GIF Images", "jpg", "gif");
chooser.setFileFilter(filter);
// 获取返回值
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
// 获取选中的文件
File file = chooser.getSelectedFile();
System.out.println("You chose to open this file: " + chooser.getSelectedFile());
}
}
public void load() {
//使文件对象等于获取的文件对象
File file = chooser.getSelectedFile();
if (file == null) {
return;
}
// 加载图片
try {
img = ImageIO.read(file);
data = new int[img.getWidth()][img.getHeight()];
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
四、实现效果
·黑白化效果
这里到了我们的重中之重,我们知道图像是由一个一个的像素构成的,而像素又是由A(透明度),R(红),G(绿),B(蓝)构成的。因此对一张图片进行处理,实质上是对每一个像素的ARGB进行处理,在这里我们暂且先只对RGB进行处理,当然,有兴趣的同学也可以加上透明度试一试。Color c = new Color(R, G, B, A);这是使用ARGB给颜色赋值的方法,要注意位置,不能写错。注意:R,G,B,A的范围均为0-255,且为整型,不可超出范围。
黑白化效果便是写一个函数,通过取出每个像素点的ARGB,ARGB为16个字节,其中A,R,G,B各占四个字节,然后通过与运算得出R,G,B其中一种,下面以B为例,得出B以后,判断B大于一个值便使画笔颜色为黑,小于一个值便使画笔颜色为白,然后将图像通过画笔画出便得到黑白化的效果。
public void heibai() {
//建立一个缓冲画布、缓冲画笔
BufferedImage image = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
Graphics e = image.getGraphics();
//通过两个for循环在画布上用不同颜色画出点
for (int i = 0; i < img.getWidth(); i++) {
for (int j = 0;