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();