与其他工具相比,在Java中从BuffereImage获得的RGB值不正确
我正在尝试可靠地跨平台获取图像像素的RGB值 对于我的测试,我使用的是别人提供给我的jpg图像(请参见下面的编辑-绘图变厚部分) 在C#中,我正在执行类似于以下内容的操作(其中bmpData是BitmapData对象): 在Java中,我尝试了以下方法,其中image是一个BuffereImage对象(从这个实用程序方法中读取的字节[]创建:): 这是:与其他工具相比,在Java中从BuffereImage获得的RGB值不正确,java,c#,image,rgb,Java,C#,Image,Rgb,我正在尝试可靠地跨平台获取图像像素的RGB值 对于我的测试,我使用的是别人提供给我的jpg图像(请参见下面的编辑-绘图变厚部分) 在C#中,我正在执行类似于以下内容的操作(其中bmpData是BitmapData对象): 在Java中,我尝试了以下方法,其中image是一个BuffereImage对象(从这个实用程序方法中读取的字节[]创建:): 这是: int rgb = image.getRGB(x, y); int r = (rgb >> 16) & 0xff; int
int rgb = image.getRGB(x, y);
int r = (rgb >> 16) & 0xff;
int g = (rgb >> 8) & 0xff;
int b = rgb & 0xff;
Raster raster = image.getRaster();
int r = raster.getSample(x, y, 0);
int g = raster.getSample(x, y, 1);
int b = raster.getSample(x, y, 2);
这是:
int rgb = image.getRGB(x, y);
int r = (rgb >> 16) & 0xff;
int g = (rgb >> 8) & 0xff;
int b = rgb & 0xff;
Raster raster = image.getRaster();
int r = raster.getSample(x, y, 0);
int g = raster.getSample(x, y, 1);
int b = raster.getSample(x, y, 2);
对于我的测试图像,结果总是如下所示。例如,以第一个像素为例:
C#结果:R=16
G=60
B=109
Java结果(在任何情况下):
R=52
G=160
B=102
所以,我有三个问题:
1.为什么它们如此不同?
2.是因为我做错了吗?
3.在这两种情况下都有更好的方法吗?
谢谢你能提供的任何帮助 编辑-2015-10-19 有人建议我使用图像工具“选择”第一个像素的颜色后,我就这样做了。数值如下: 微软绘画:
R=17
G=61
B=110
GIMP:
R=16
G=60
B=109
所以我的问题变成了:
为什么Java的BuffereImage类中的RGB值如此错误? 编辑-绘图变厚
我从GIMP导出图像,并通过相同的程序运行,现在RGB图形都正确匹配 GIMP导出过程中的某些东西已经改变了它,因此它现在在Java库中也可以工作 现在我需要弄清楚发生了什么变化!不幸的是,我在这方面的知识有限 我已经检查了alpha预计算、颜色模型和颜色空间。一切在视觉上都是一样的 图像(我希望没有改变):
实施的解决方案
根据安德斯的建议,我首先调查了十二只猴子的“插件”,因为它似乎是最干净的解决方案 我还注意到,作者编写了一个插件来处理tiff文件,这是一个额外的好处,因为我以前是通过tiff的魔法数字来识别tiff的,并使用JAI库来转换它们。不再需要了 为了实现这一点,我只添加了以下gradle依赖项:
compile 'com.twelvemonkeys.imageio:imageio-jpeg:3.1.2'
compile 'com.twelvemonkeys.imageio:imageio-tiff:3.1.2'
刷新并再次运行。当它再次运行时,我可以从调试器以及结果中看到图像已正确加载到BuffereImage对象中
然后RGB值也正确了。谢谢 如您所述,此问题与中的问题完全相同。您可以通过读取图像然后将其写入文件来确认。看起来像 这个问题有多种解决办法。最简单的方法似乎是将其作为依赖项包含到项目中。您不需要进行任何代码更改。这个 其他备选方案:
ImageIO
,因为它没有相同的错误正如您所提到的,这个问题与中的问题完全相同。您可以通过读取图像然后将其写入文件来确认。看起来像 这个问题有多种解决办法。最简单的方法似乎是将其作为依赖项包含到项目中。您不需要进行任何代码更改。这个 其他备选方案:
ImageIO
,因为它没有相同的错误您是否使用了第三个工具来获取同一像素的值,以便知道它是C#还是Java,这是错误的?您得到的是
int-pixel=
,但随后(rgb>>16)
,可能您需要(pixel>>16)
?@gael-这不是个坏主意。你能推荐一个工具吗?@Lashane-啊,对不起!打字错误我会尽快修好的。假设像素实际上被调用rgb@ndtreviv:好吧,我会用一种很难的方法:用油漆或类似的东西打开图像,放大到第一个像素,然后使用类似于颜色选择器的东西。但是应该有更快的方法来做到这一点!您是否使用了第三个工具来获取同一像素的值,以便知道它是C#还是Java,这是错误的?您得到的是int-pixel=
,但随后(rgb>>16)
,可能您需要(pixel>>16)
?@gael-这不是个坏主意。你能推荐一个工具吗?@Lashane-啊,对不起!打字错误我会尽快修好的。假设像素实际上被调用rgb@ndtreviv:好吧,我会用一种很难的方法:用油漆或类似的东西打开图像,放大到第一个像素,然后使用类似于颜色选择器的东西。但是应该有更快的方法来做到这一点!一、 同样,他们也选择了十二只猴子的“插件”。我将为上面的问题添加完整的解决方案,以便于其他人寻找相同的答案。我也选择了twelvemonkeys“插件”。我将为上述问题添加完整的解决方案,以便于其他人寻找相同的答案。