Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与其他工具相比,在Java中从BuffereImage获得的RGB值不正确_Java_C#_Image_Rgb - Fatal编程技术网

与其他工具相比,在Java中从BuffereImage获得的RGB值不正确

与其他工具相比,在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

我正在尝试可靠地跨平台获取图像像素的RGB值

对于我的测试,我使用的是别人提供给我的jpg图像(请参见下面的编辑-绘图变厚部分)

在C#中,我正在执行类似于以下内容的操作(其中bmpData是BitmapData对象):

在Java中,我尝试了以下方法,其中image是一个BuffereImage对象(从这个实用程序方法中读取的字节[]创建:):

这是:

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值也正确了。谢谢

如您所述,此问题与中的问题完全相同。您可以通过读取图像然后将其写入文件来确认。看起来像

这个问题有多种解决办法。最简单的方法似乎是将其作为依赖项包含到项目中。您不需要进行任何代码更改。这个

其他备选方案:

  • 马克·杰罗尼莫斯写了一篇文章,将坏的图像转换成正确的图像。我在你的样本图像上测试了它,效果很好。但是,您需要找到一种很好的方法来检测转换是否必要。对这个答案有一个评论可能会有所帮助
  • 正如ludovic所建议的,您可以使用打开图像而不是
    ImageIO
    ,因为它没有相同的错误

  • 正如您所提到的,这个问题与中的问题完全相同。您可以通过读取图像然后将其写入文件来确认。看起来像

    这个问题有多种解决办法。最简单的方法似乎是将其作为依赖项包含到项目中。您不需要进行任何代码更改。这个

    其他备选方案:

  • 马克·杰罗尼莫斯写了一篇文章,将坏的图像转换成正确的图像。我在你的样本图像上测试了它,效果很好。但是,您需要找到一种很好的方法来检测转换是否必要。对这个答案有一个评论可能会有所帮助
  • 正如ludovic所建议的,您可以使用打开图像而不是
    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“插件”。我将为上述问题添加完整的解决方案,以便于其他人寻找相同的答案。