马赛克效果的思路:在固定范围内放大像素点,并跳过相应的像素点!
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();
}
}