马赛克效果的滤镜实现-CSDN博客

12 阅读2分钟

马赛克效果的思路:在固定范围内放大像素点,并跳过相应的像素点!

package com.gch.mosaic;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/**
   马赛克效果的实现
 */
public class MosaicPixelUI {
    /**
       图像处理界面
     */
    public void showUI(){
        JFrame win = new JFrame("马赛克");
        JPanel panel = new JPanel();
        win.add(panel);
        win.setSize(750,600);
        win.setLocationRelativeTo(null);
        win.setDefaultCloseOperation(3);

        win.setVisible(true);

        // 获取画笔
        Graphics g = win.getGraphics();

        // 给窗体添加鼠标监听器
        win.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("点击!");
                // 指定图片路径
                String path = "C:\\Users\\A.G.H\\Pictures\\Saved Pictures\\热气球.jpg";
                // 将图片转化为int型的二维数组
                int[][] pixelArr = getImagePixel(path);
                // 调用马赛克效果实现
                mosaicPixel(pixelArr);
            }

            /**
             * 马赛克效果的实现:在固定范围内放大像素点
             * @param pixelArr:保存图片像素点的像素值的二维数组
             */
            public void mosaicPixel(int[][] pixelArr){
                // 通过双层循环遍历保存像素点的像素值的二维数组
                for(int i = 0;i < pixelArr.length;i+=12){
                    for(int j = 0;j < pixelArr[0].length;j+=12){
                        // 取出图片的所有像素值
                        int pixel = pixelArr[i][j];
                        // 把像素值转为Color对象
                        Color color = new Color(pixel);
                        // 把画笔设置成当前颜色
                        g.setColor(color);
                        // 绘制当前颜色的像素点
                        g.fillRect(j , i , 12, 12);
                    }
                }


            }


            /**将图片转换为int型的二维数组,获取图片像素的宽高,获取每个像素点的像素值
             * 获取指定路径图片的像素点的像素值
             * @param path:指定图片路径
             * @return:返回保存指定路径图片像素点的像素值的二维数组
             */
            public int[][] getImagePixel(String path){
                // 创建文件对象
                File file = new File(path);
                // BufferedImage:图像缓冲区,图片数据的封装类
                BufferedImage bufferedImage = null;
                // 用输入流读取指定文件的数据
                try {
                   bufferedImage = ImageIO.read(file);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                // 获取图片像素的宽高
                int w = bufferedImage.getWidth(); // 宽:对应二维数组的列
                int h = bufferedImage.getHeight(); // 高:对应二维数组的行
                // 保存到二维数组
                int[][] pixelArr = new int[h][w];
                // 遍历二维数组的每一个元素,通过双层循环遍历整个图片的像素点
                for(int i = 0;i < h;i++){
                    for(int j = 0;j < w;j++){
                        // 通过图像缓冲区bufferedImage对象的getRGB()方法获取每个像素点的像素值
                        int pixel = bufferedImage.getRGB(j, i);
                        // 把每个像素点的像素值保存到二维数组中
                        pixelArr[i][j] = pixel;
                    }
                }
                // 返回保存指定图片像素点的像素值的二维数组
                return pixelArr;
            }


            @Override
            public void mousePressed(MouseEvent e) {
            }
            @Override
            public void mouseReleased(MouseEvent e) {
            }
            @Override
            public void mouseEntered(MouseEvent e) {
            }
            @Override
            public void mouseExited(MouseEvent e) {
            }
        });
    }
}
package com.gch.mosaic;

public class Manage {
    /**
       主函数
     */
    public static void main(String[] args) {
        MosaicPixelUI ui = new MosaicPixelUI();
        ui.showUI();
    }
}