代码的主要目的是读取一张图片的RGB数值打印到Excel中,其实也是看了一个B站上的视频有感而发,指路原视频地址:DOTA2 用Excel来画一个伐木机 ——制作人并不是我哟
- 关键地方就是一个对计算机底层存储RGB图片的知识的了解
- 像素在计算机中通常用3个字节24位保存,如16-23位表示红色(R)分量,8-15 位表示绿色(G)分量,0-7 位表示蓝色(B)分量
- 还有就是注意每一行打印完之后为了节省掉来回切换Excel下面滑动栏耗费的时间,选择反向打印方向,也就是说本来第一行打印完之后,我们不是得从第二行的第一个格子开始打印吗,但如果图像的长度很长,每次拉动滑条都很浪费时间,我们选择直接从上一行的最后一格的下面一格开始打印,这里能这样打印的条件是第二行的RGB数据已经提前反转了,比如原来第二行装备打印「红,绿,蓝」现在变成了「蓝,绿,红」,然后还是从后往前打印的,这样就保证了即使从后往前和从前往后打印的同样的效果,而且大大节省了滑动滚轮上时间的浪费。
项目开源地址: Panting In Excel
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ReadImgRgb {
public static int[][][] getImagePixel(String path) throws IOException {
File file = new File(path);
BufferedImage buffer;
buffer = ImageIO.read(file);
assert buffer != null;
int width = buffer.getWidth();
int height = buffer.getHeight();
int minx = buffer.getMinX();
int miny = buffer.getMinY();
int[][][] matrix = new int[height][width][3];
for (int j = miny; j < height; j++) {
for (int i = minx; i < width; i++) {
int pixel = buffer.getRGB(i, j);
matrix[j][i][0] = (pixel & 0xff0000) >> 16;
matrix[j][i][1] = (pixel & 0xff00) >> 8;
matrix[j][i][2] = (pixel & 0xff);
}
}
return matrix;
}
public static void reverse(int[][][] ori, int width, int height) {
int start = 0;
int end = width - 1;
while (start < end) {
for (int i = 0; i < 3; i++) {
int temp = ori[height][start][i];
ori[height][start][i] = ori[height][end][i];
ori[height][end][i] = temp;
}
start++;
end--;
}
}
public static void getMatrixRgb(int[][][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int o = 1;
for (int i = 0; i < m; i++) {
if ((i & 1) != 0) reverse(matrix, n, i);
for (int j = 0; j < n; j++) {
System.out.println("[part" + (o++) +"]");
System.out.println("R=" + matrix[i][j][0]);
System.out.println("G=" + matrix[i][j][1]);
System.out.println("B=" + matrix[i][j][2]);
}
}
}
public static void main(String[] args) throws IOException {
getMatrixRgb(getImagePixel("C:\\Users\\Administration\\Desktop\\rgb.png"));
}
}