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;

        }

其他功能也可以试着实现哦。