BufferedImage字节数组操作会影响相邻像素

时间:2017-04-15 08:53:15

标签: java arrays bufferedimage javax.imageio

我正在尝试在java中实现一些低级过滤器。为此,我必须能够操纵图像的每个像素。我认为最好的方法是将图像转换为字节数组并从那里开始。

我创建了一个由4个完全红色像素组成的2x2图像。然后我将其读入数组并使用以下代码得到相当准确的表示:

BufferedImage bufferedImage = null;
try {
    bufferedImage = ImageIO.read(new File("image.jpeg"));
} catch (IOException e) { }

byte[] b = ((DataBufferByte) bufferedImage.getRaster().getDataBuffer()).getData();

这是应该的。我从数组中得到了这个读数。

0 0 -2  0 0 -2  0 0 -2  0 0 -2

这些是每个像素的RGB通道。由于某种原因,它们反向打印。 B,G,R。你可以看到像素是红色的,因为红色通道的字节是-2。 (因此,它们的无符号值为254)。

当我更改数组中这些像素的值然后尝试将该数组转换回图像时出现问题。例如,我将第一个像素更改为白色:

-1 -1 -1  0 0 -2  0 0 -2  0 0 -2
转换的

我使用此代码:

ImageIO.write(bufferedImage, "jpg", new File("new_image.jpg"));

但这也影响了邻近的像素。它应该只将第一个像素设置为白色,就是这样。我有两张图片供比较。

Original image

Processed image

*不要介意底角的虚线矩形。我在截图时不知道它来自哪里。

1 个答案:

答案 0 :(得分:2)

(代表OP发布)

JPEG是一种有损格式,它始终(即使在100%质量下)压缩图像,因此它会丢失一些细节。使用.bpm或.png没有这种效果,并且可以正常工作。