gpt4 book ai didi

Java 位图 RGB 操作

转载 作者:行者123 更新时间:2023-12-02 05:23:06 29 4
gpt4 key购买 nike

这个问题可能有点令人困惑,但我们开始吧!

所以,我观看了 Notch 编写游戏,他做了一些有趣的事情。他创建了一个位图类,将每个像素存储在一个数组中。 (整数数组)。然后我想到了自己尝试位图,然后我想到了操纵/更改位图的 R、G 和 B。

所以,我尝试这样做的方式是这样的:

    int rmod =  100;
int gmod = 100;
int bmod = 100;
for (int i = 0; i < 64*64; i++) {
int color = testBitmap.pixels[i];
int r = color >> 16;
int g = color >> 8;
int b = color;

r = (r/100)*rmod;
g = (g/100)*gmod;
b = (b/100)*bmod;

testBitmap.pixels[i] = r+b+g;
}

所以,是的,这个想法是 rmod、gmod 和 bmod 的工作方式类似于 R G B 的 %。所以,当它们都为 100 时,位图会正常显示,这就是想法。然后,假设将 rmod 更改为 150,R 将“更强”50%。

现在,我知道我在这里做错了一些事情。我认为 int r、g 和 b 是正确的。 (尽管我不太明白“>>”的作用。我知道它会移动字节或其他东西,但我并没有真正明白。)在得到 r g 和 b 后,我得到了其中的 1%,并将它们与 rmod、gmod 和 bmod 中声明的百分比相乘。然后,我相信我在设置当前像素的新 RGB 的行上做了完全错误的事情。 (testBitmap.pixels[i] = r+g+b;)

不太确定如何做到这一点。如果有人可以尝试解释“>>”如何工作以及为什么它在这种情况下工作,以及如何能够通过 rmod、gmod 和 bmod 操作 RGB,我会很高兴!

可能是我提供的信息太少,所以如果您需要查看类(class)等,我也可以将它们发布在这里!

谢谢!

最佳答案

首先,运算符>>向右移动一个位模式,无论位置多少。右移相当于除以 2 的幂。例如,(所有数字均为二进制),1000 >> 3 = 0001 (将“1000”向左移动 3 次)。 1000 二进制为 8,因此 1000 >> 3 = 10002/23 = 1。

但是,您希望代码进行二进制左移 << ,等于乘以 2 的幂。这样做的原因是,由于您处理的是 RGB 值(24 位),因此您希望将红色乘以 216,将绿色乘以 28,蓝色增加 20。总共是 24 次方。因此,24 位。我不确切确定这是为什么,我相信其他人可以解释它。

对于您的阵列testBitmap.pixels[] ,我假设这是位图中的实际 RGB 数据。这需要对位图文件格式的工作原理有一定的了解,但基本上,像素是以“相反”顺序存储的;例如RGB 数据(相对于图像像素)从左到右、从下到上、以三元组形式存储,例如如果文件中的第一个三元组是“00 00 FF”,则左下角像素将为红色。

因此,您意识到需要另一个数组来实际存储像素,因为 testBitmap.pixels 数组保存字节(以三元组形式,以 BGR 形式)。

现在我们已经解决了这个问题(如果您仍然不明白,有很多资源可以理解位图文件格式以及如何读取它们),将每个三元组转换为单个整数像素,您需要首先通过添加 & 0xFF 来获取每个字节的无符号值到 r、g 和 b 作业的末尾。所以,

int g = testBitmap.pixels[i] << 16 & 0xFF;
int b = testBitmap.pixels[i+1] << 8 & 0xFF;
int r = testBitmap.pixels[i+2] & 0xFF;

要将这些值转换为单个整数像素,请在它们之间使用按位 OR 运算符,因此

int pixel = (r | g) | b;

然后,如果您想将这些值存储在图像中的 (x, y) 位置,请使用 BufferedImage.setRGB(x, y, pixel) 。但要小心,因为位图文件格式存储像素的方式是“颠倒”的。

要编辑这些值,请将每个值乘以一个常数,但请记住这些值只能在 0 到 255 之间。

关于Java 位图 RGB 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26330581/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com