JAVA图片绘制快速算法
思路
1.设计绘制图片界面
2.设置监听器
3.设置绘制图片工具(实现多种绘制图片需求)
设计界面
这里我们采用JPanle面板进行界面设计,也就是在JFrame窗体中,加入JPanle面板在JPanle面板中,我们又可以在面板里放置按钮等其他组件。
例如:BorderLayout.WEST就是将设置的组件放在窗体左侧,BorderLayout.EAST就是将设置的组件放在窗体右侧,BorderLayout.NORTH就是将设置的组件放在窗体上面,BorderLayout.SOUTH就是将设置的组件放在窗体下面,不加以说明则默认为中央。
在此界面中,我们设计两个面板,左侧放置图片种类按钮,右侧绘制图片
import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
public class ImageProUI{
public static void main(String[] args){
new ImageProUI ().initUI();
}
// 设置监听器
ImageListener imgl = new ImageListener();
private void initUI(){//界面设计
JFrame jf = new JFrame ();
jf.setSize (800,700);
jf.setDefaultCloseOperation (WindowConstants.EXIT_ON_CLOSE);
// 使用默认布局
JPanel btnPanel = new JPanel();//左侧放置图片种类按钮
JPanel imgPanel = new JPanel ();//右侧用来绘制图片
btnPanel.setBackground (Color.LIGHT_GRAY);//设置按钮面板为灰色
imgPanel.setBackground (Color.BLACK);//设置图片面板为灰色
// 给按钮面板设置一个宽度
btnPanel.setPreferredSize (new Dimension (100,0));
jf.add (btnPanel,BorderLayout.WEST);//左侧放置图片种类按钮
jf.add (imgPanel);// 默认就是中央
// 向按钮面板 添加 按钮
String[] btnstrs = {"原图"};
// 遍历
for(int i = 0; i < btnstrs.length; i++){
JButton btn = new JButton (btnstrs[i]);//创建按钮对象
btn.setPreferredSize (new Dimension (95,35));//设置按钮尺寸
btn.setBackground (Color.WHITE);//按钮颜色为白色
btn.setFont (new Font ("楷体",Font.PLAIN,16));//设计字体为楷体
btnPanel.add (btn);//在按钮面板添加按钮
btn.addActionListener (imgl);//监听器
}
jf.setVisible (true);
// 获取画笔从 imgPanel 上获取
Graphics g = imgPanel.getGraphics ();
// 传入 监听器对象
imgl.g=g;
}
}
设置监听器
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ImageListener implements ActionListener {
ImageTools imageTools = new ImageTools();
Graphics g;
int [][]imgArr ;
{
String path = "E:\\preview.jpg";//图片路径
imgArr = imageTools.getImageArray(path);
}
@Override
public void actionPerformed(ActionEvent e) {
String btnstr = e.getActionCommand();
switch(btnstr){
case "原图": // 绘制图片
System.out.println ("原图");
imageTools.drawImage (imgArr,g);
break;
}
}
}
设置绘制图片工具
import java.io.File;
import java.io.IOException;
public class ImageTools {
Graphics g;
public int[][] getImageArray(String path) {
File file = new File(path);
BufferedImage bufferedImage =null ;
try {
bufferedImage = ImageIO.read (file);
} catch (IOException e) {
throw new RuntimeException (e);
}
int width = bufferedImage.getWidth();
int height = bufferedImage.getHeight ();
int [][]imgArr = new int[width][height];
for(int i = 0; i < imgArr.length; i++){
for(int j = 0; j < imgArr[i].length; j++){
imgArr[i][j] = bufferedImage.getRGB (i, j);
}
}
return imgArr;
}
//原图
public void drawImage(int[][] imgArr, Graphics g){
// 先创建一个空的BufferedImage
BufferedImage bufferedImage = new BufferedImage (
imgArr.length,imgArr[0].length,
BufferedImage.TYPE_INT_ARGB);
for(int i = 0; i < imgArr.length; i++){
for(int j = 0; j < imgArr[i].length; j++){
int pixnum = imgArr[i][j];
int red = (pixnum >> 16) & 255;
int green = (pixnum >> 8) & 255;
int blue = (pixnum ) & 255;
Color color = new Color (red,green,blue);
bufferedImage.setRGB (i,j,color.getRGB());
}
}
// 循环结束之后 将buffimg 绘制出来
g.drawImage (bufferedImage,0,0,null);
}
}
基本功能实现后,我们可以进行添加功能
//灰度图
public void drawGrayImage(int[][] imgArr, Graphics g){
// 先创建一个空的BufferedImage
BufferedImage bufferedImage = new BufferedImage (
imgArr.length,imgArr[0].length,
BufferedImage.TYPE_INT_ARGB);
for(int i = 0; i < imgArr.length; i++){
for(int j = 0; j < imgArr[i].length; j++){
int pixnum = imgArr[i][j];
int red = (pixnum >> 16) & 255;
int green = (pixnum >> 8) & 255;
int blue = (pixnum ) & 255;
int gray = (int)(red*0.28+green*0.36+blue*0.36)/3;
Color color = new Color (gray,gray,gray);
bufferedImage.setRGB (i,j,color.getRGB());
}
}
// 循环结束之后 将buffimg 绘制出来
g.drawImage (bufferedImage,0,0,null);
}
然后在按钮面板里添加
// 向按钮面板 添加 按钮
String[] btnstrs = {"原图","灰度"};
// 遍历
for(int i = 0; i < btnstrs.length; i++){
JButton btn = new JButton (btnstrs[i]);//创建按钮对象
btn.setPreferredSize (new Dimension (95,35));//设置按钮尺寸
btn.setBackground (Color.WHITE);//按钮颜色为白色
btn.setFont (new Font ("楷体",Font.PLAIN,16));//设计字体为楷体
btnPanel.add (btn);//在按钮面板添加按钮
btn.addActionListener (imgl);//监听器
}
在监视器里添加
switch(btnstr){
case "原图": // 绘制图片
System.out.println ("原图");
imageTools.drawImage (imgArr,g);
break;
case "灰度": // 绘制图片
System.out.println ("huidu");
imageTools.drawGrayImage (imgArr,g);
break;
}
其他功能也可以试着实现哦。