Java与VB.net中的RGB颜色

7

我是一名非母语英语的讲者,因此请原谅任何翻译错误。

我并没有遇到编码问题。这更像是一个概念性问题。

我写了两次相同的代码,将图像转换为RGB值列表(每个像素的1组3个值的组合)。

我首先使用VB.net编写了代码:

Dim bmp As New Bitmap(File)
For x As Integer = 0 To w - 1 
    For y As Integer = 0 To h - 1
        Dim c As Color = bmp.GetPixel(x, y)
        Dim Red as integer = c.R
        Dim Green as integer = c.G
        Dim Blue as integer = c.B
    Next y
next x

接着我用Java写了以下代码:

BufferedImage image = ImageIO.read(new File(File))
for (int i = 0; i < w; i++) {
    for (int j = 0; j < h; j++) {
        int pixel = image.getRGB(i,j);
        int Red = ((pixel >> 16) & 0xff);
        int Green = ((pixel >> 8) & 0xff);
        int Blue = ((pixel) & 0xff);
    }
}

我的期望是从这两个代码片段中获得相同的值,因为它们使用了同一张图片。我在一张照片(270x320)上尝试了一下,以便包含了整个色谱。令我惊讶的是,在 VB.net 和 Java 代码之间的 RGB 值中存在小差异。
如果我比较 java(红色)与 VB.net(红色)之间的值、java(绿色)与 VB.net(绿色)之间的值以及 java(蓝色)与 VB.net(蓝色)之间的值,那么我需要比较 270x320x3 = 259.2k 种组合。从 VB.net 和 Java 代码获取的整数之间的差异如下:
- 没有差异:250178(96.5%) - 一个差异:7426(2.9%) - 两个差异:1582(0.6%) - 三个差异:14(0.0%) - 四个或更多差异:0(0.0%)
有人能解释一下这种差异来自哪里吗?它与读取颜色的方式、缓冲图像的方式还是抗锯齿等因素有关? 非常好奇原因是什么,谢谢。

可能是图像元数据告诉图像处理库稍微改变颜色。 可能一个库会遵循这些元数据,而另一个则会忽略它们。 这些元数据的例子包括ICC颜色配置文件、伽马校正值等。 - Salman A
1
文件扩展名是什么? - Adrian Jałoszewski
1
我尝试了 Jpeg 对比 Jpeg 和 Jpeg 对比 Png。 - Bert-Jan Stroop
2
@Bert-JanStroop,尝试使用bmp文件进行测试,以排除可能存在的图像算法差异。 - Mr47
1个回答

1

正如其他人所提到的,这种差异是由JPEG有损压缩引起的。

你应该使用无损格式来测试这些方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接