【问题标题】:BufferedImage byte array manipulation affects neighboring pixelsBufferedImage 字节数组操作会影响相邻像素
【发布时间】:2017-04-15 08:53:14
【问题描述】:

我正在尝试在 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"));

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

*不介意底角的虚线矩形。我截屏的时候不知道从哪里来的。

【问题讨论】:

    标签: java arrays bufferedimage javax.imageio


    【解决方案1】:

    (代表 OP 发布).

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

    【讨论】:

    • 这不应该给出给定的图像,这里发生了其他事情。
    • @Jean:这是 OP 发布的解决方案,我只是将其移至 wiki 答案。也许在他们的问题下 ping 他们?
    • 是的,答案是正确的,我没有想太多......当然这是由于有损压缩。对不起,伙计们。
    • 你的意思是有损,不是无损。
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多