美颜相机开发手册
1.数字化图像底层原理
2.文件读取图片,操作图片矩阵
3.图像滤镜算法实现
4.项目结构设计
5.图像存储,附加功能实现(画笔/P图/贴纸…)
6.卷积图像处理算法实现
7.图像识别原理
8.二维码的生成与识别
9.以图搜图功能实现
首先解释一下数字化图像:一张图片是由一个一个的像素点组队的,每一个像素点其实在数学解释上可以看成平面直角坐标系中的一个一个点,每一个像素点对应着一个坐标,通过对很多像素点的渲染然后集中遍历就显现出了图片的效果(以上纯属个人理解,让本人可以更好理解的解释)。今天我们的主要目的就是实现把一张图片数字化然后在渲染出来,而在java中我们存储图片使用二维数组来实现。
实现的方法以及对应的解释:
package wenhao666;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class CameraUi extends JFrame {
private Graphics g;
public CameraUi(){
setTitle("美颜相机复盘");
setSize(800,800);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
setVisible(true);
}
//上传一张图片
private static String path="F://新建文件夹/美颜相机复盘/img/6.png";
@Override
public void paint(Graphics g) {
super.paint(g);
int[][] imagePix = getImagePix(path);
//遍历二维数组将其打印
for (int i = 0; i < imagePix.length; i++) {
for(int j=0;j<imagePix[i].length;j++){
//取出像素点进行渲染
int pix = imagePix[i][j];
//颜色渲染
Color srcColor = new Color(pix);
//绘制图片
g.setColor(srcColor);
g.fillRect(50+i,75+j,1,1);
}
}
}
//将图片转化为二维数组的方法,也就是我们说的数字化
public int[][] getImagePix(String path){
File file = new File(path);
int [][] imagarr = new int[0][];
try {
BufferedImage bufferImg = ImageIO.read(file);
//获取图片的宽和高方便将其转化为对应的二维数组
int w = bufferImg.getWidth();
int h = bufferImg.getHeight();
// 遍历数组将图片转化为像素点(二维数组)
imagarr = new int[w][h];
for (int i = 0; i < w; i++) {
for(int j=0;j<h;j++){
/**
* 以下是作者为大家翻译的getRGB的方法全部解释,重点看最后一句
* 从一部分图像数据返回默认RGB颜色模型和默认sRGB颜色空间中的整数像素数组。如果默认模型与图像颜色模型不匹配,则会发生颜色转换。使用此方法时,返回数据中的每个颜色分量只有8位精度。使用图像中的指定坐标(x,y),可以通过以下方式访问ARGB像素:
像素=rgbArray[偏移+(y-startY)*扫描大小+(x-startX)];
如果区域不在边界内,则可能抛出ArrayOutOfBoundsException。然而,不能保证显式边界检查。
参数:
startX–起始X坐标
startY–起始Y坐标
w–区域宽度
h–区域高度
rgbArray–如果不为空,则在此处写入rgb像素
偏移–偏移到rgbArray
scansize–rgbArray的扫描线步幅
返回:RGB像素阵列。
**/
imagarr[i][j]=bufferImg.getRGB(i,j);
}
}
} catch (IOException ioException) {
ioException.printStackTrace();
}
return imagarr;
}
public static void main(String[] args) {
CameraUi cu = new CameraUi();
cu.paint(cu.g);
}
}
运行的结果:
这张图片为原图绘制,接下来我们把图片绘制的方法进行一个封装以实现更多的效果,新建一个图片绘制类ImageFilter类,接下来演示黑白照片的绘制以及原图绘制方法的封装
package wenhao666;
import java.awt.*;
/**
* 图像操作统一封装
*/
public class ImageFilter {
/**
* 图片原图的绘制
* @param imagePix
* @param g
*/
public static void drawImage_01(int[][] imagePix,Graphics g){
//遍历二维数组将其打印
for (int i = 0; i < imagePix.length; i++) {
for(int j=0;j<imagePix[i].length;j++){
//取出像素点进行渲染
int pix = imagePix[i][j];
//颜色渲染
Color srcColor = new Color(pix);
//绘制图片
g.setColor(srcColor);
g.fillRect(50+i,75+j,1,1);
}
}
}
public static void drawImage_02(int[][] imagePix,Graphics g){
//遍历二维数组将其打印
for (int i = 0; i < imagePix.length; i++) {
for(int j=0;j<imagePix[i].length;j++){
//取出像素点进行渲染
int pix = imagePix[i][j];
//颜色渲染
int red = (pix>>16)&0xFF;
int green = (pix>>8)&0xFF;
int blue = (pix>>0)&0xFF;
Color srcColor = new Color(red,red,red);
//绘制图片
g.setColor(srcColor);
g.fillRect(50+i,75+j,1,1);
}
}
}
}
这里封装的就是图片滤镜处理的方法,需要怎样的滤镜调用对应的方法就可以。
黑白滤镜的展示效果:
转载或商业合作请联系作者个人微信号:wh1778157820