读取图片RGB数据

代码的主要目的是读取一张图片的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"));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值