0

我无法将颜色更改应用于图像的像素。它必须通过计算来完成,例如这是我用于灰度的代码,它工作正常:

for (int x = 0; x < w; x++) {
            for (int y = 0; y < h; y++) {
                int pixel = pixelReader.getArgb(x, y);
                int alpha = ((pixel >> 24) & 0xff);
                int red = ((pixel >> 16) & 0xff);
                int green = ((pixel >> 8) & 0xff);
                int blue = (pixel & 0xff);

                int avg = (int)(red + green + blue) / 3;
                pixel = (alpha << 24) | (avg << 16) | (avg << 8) | avg;

                writer.setArgb(x, y, pixel);

            }
        }
        kittenImage.setImage(newImage);

就像我说的,这很好用。我还必须将图片更改为红色、绿色和蓝色,并且我已经使用该代码进行了调整。这是红色过滤器的代码:

for (int x = 0; x < w; x++) {
            for (int y = 0; y < h; y++) {
                int pixel = pixelReader.getArgb(x, y);
                int alpha = ((pixel >> 24) & 0xff);
                int red = ((pixel >> 16) & 0xff);
                int green = ((pixel >> 8) & 0xff);
                int blue = (pixel & 0xff);

                int redLevel = (0 << 24) | (red << 16) | (0 << 8) | 0;
                writer.setArgb(x, y, -redLevel);
            }
        }
        kittenImage.setImage(newImage);

我曾希望我可以改变最突出的颜色,但该代码只会让我得到一个负面的红色图像,这不是我需要的。

我显然无法在此发布图片,所以我必须弄清楚如何做到这一点以表达我的意思。我一直在研究这个并在灰度上发现了很多,但是红色、蓝色和绿色上的所有东西似乎都指向内置的函数或方法,这不是我想要的。

这只是我的第二个问题,所以如果我需要包含其他信息,请告诉我。

编辑:这是我从中获得灰度的地方,我用另一个使用 Argb 而不是 RGB 的版本对其进行了修改。(我没有使用缓冲图像)。 将RGB图像转换为灰度图像减少java中的内存

这是 Argb 版本:http ://skrb.hatenablog.com/entry/2013/01/07/171901

4

1 回答 1

0

没关系,我一直在玩它,并意识到我做错了什么。当我只需要使用已经存在的像素变量时,我正在为像素声明一个新的 int 变量。像这样:

for (int x = 0; x < w; x++) {
            for (int y = 0; y < h; y++) {
                int pixel = pixelReader.getArgb(x, y);
                int alpha = ((pixel >> 24) & 0xff);
                int red = ((pixel >> 16) & 0xff);
                int green = ((pixel >> 8) & 0xff);
                int blue = (pixel & 0xff);

                pixel = (alpha << 24) | (red << 16) | (0 << 8) | 0;
                writer.setArgb(x, y, pixel);
            }
        }
        kittenImage.setImage(newImage);

因此,它不是“int redLevel”,而是较早声明的像素,并且效果很好。希望这可以帮助别人。

于 2017-03-27T01:51:59.313 回答