Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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 如何获取类型为3字节的jpeg图像的rgb值?_Java_Image_Image Processing_Jpeg_Rgb - Fatal编程技术网

Java 如何获取类型为3字节的jpeg图像的rgb值?

Java 如何获取类型为3字节的jpeg图像的rgb值?,java,image,image-processing,jpeg,rgb,Java,Image,Image Processing,Jpeg,Rgb,我有这样的图像: 我想在int[]中提取此图像的RGB值。这是我到目前为止为PNG图像所做的工作: File f = new File("t.jpg"); BufferedImage img = ImageIO.read(f); int[] ib = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); Color c = new Color(ib[0]); System.out.println(

我有这样的图像:

我想在
int[]
中提取此图像的RGB值。这是我到目前为止为PNG图像所做的工作:

File f = new File("t.jpg");
BufferedImage img = ImageIO.read(f);
int[] ib = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth());
Color c = new Color(ib[0]);
System.out.println(c.getRed() + " " + c.getGreen() + " " + c.getBlue());
但是这里我得到了这个输出:
255128
,这是不期望的,因为我清楚地看到(并且已经在几个图像编辑器中验证)位于(0,0)的像素具有这些值
255

我注意到,
img.getType()
返回的类型等于,所以我猜这是幕后发生的解码问题,但我不知道如何解决它(或者更清楚地了解发生了什么)


有人会对如何正确解码这种类型提出建议吗?

在对不同的解决方案进行了大量测试之后,我发现了
com.sun.imageio.plugins.jpeg.JPEGImageReader
类的一个bug(该类由
imageio
类用于解码jpeg)

如果我这样做了(Oracle推荐,因为这应该适用于所有JVM和SO中的许多其他线程):

然后我得到redish图像

另一方面,如果我这样做:

JPEGImageDecoder jpegDec = JPEGCodec.createJPEGDecoder(new FileInputStream("t.jpg"));
BufferedImage bi = jpegDec.decodeAsBufferedImage();
然后我得到正确解码的图像。(请注意,
com.sun.image.codec.jpeg.JPEGCodec
是sun/Oracle JVM的一个特定类,因此此解决方案不可移植)


最后,我尝试的另一种方法是使用
Toolkit.getDefaultToolkit().createImage()
。图像是异步加载的(我认为这是一个小缺点),但至少它可以正确加载我的图像。不过,我不能100%确定最后一个解决方案在所有平台/JVM上都是可移植的。

为什么不使用而不是?可以通过将文件上的图像绘制为新的BuffereImage,将其转换为键入_INT_RGB。但是粗糙&准备好了,但是应该work@Eng.Fouad1.因为这种方法更有效。2.因为它很可能会返回相同的结果(虽然我还没有测试它),重复?@hovercraftfullofels我想到了,但是[0,0]像素值是0xffff8080,在CMYK中不会产生白色。我甚至检查了实验室以防万一,但这也不行。
JPEGImageDecoder jpegDec = JPEGCodec.createJPEGDecoder(new FileInputStream("t.jpg"));
BufferedImage bi = jpegDec.decodeAsBufferedImage();