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

标签 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 channel 。由于某种原因它们被反向打印。 B、G、R。您可以看到像素是红色的,因为红色 channel 的字节是-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

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

最佳答案

(代表 OP 发布)

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

关于java - BufferedImage 字节数组操作影响相邻像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43424107/

相关文章:

arrays - for 循环中的协议(protocol)一致性检查?

c - 如何对C中输出的正确名称排序列表进行排序?

ios - Swift 为 API REST 创建 Json

java - 将图像转换为 BufferedImage

java - 旋转 BufferedImage 并将其保存到像素数组中

java - 如何使用 XSL 排列数据

java - 如何迭代动态 JSON 键

java - 根据项目版本使用发布或快照存储库进行手动部署

java - Struts2:全局结果配置错误

grails - Grails:将BufferedImage写入响应