我注意到,当在JPEG格式的设备上读取相同的照片时,像素值不匹配.它们很接近但不同.转换为PNG文件时,像素值似乎匹配.
这似乎是由于跨设备的(非)压缩算法.无论如何,这就是我想到的.有没有办法读取JPEG文件,以便跨设备从照片中检索相同的像素?我没有在BitmapFactory Options组件中看到一个选项.
当处理跨设备的图像的像素值时,当前应用以下内容来维持大小:
Options options = new Options();
options.inScaled = false;
options.inPreferQualityOverSpeed = true;
Run Code Online (Sandbox Code Playgroud)
目前比较像素与以下只是为了看几个(近似匹配,但不相等):
int[] pixels = new int[bitmapF.getWidth() * bitmapF.getHeight()];
bitmapF.getPixels(pixels, 0, bitmapF.getWidth(), 0, 0, bitmapF.getWidth(), bitmapF.getHeight());
Log.d("pixel entries", "pixels = " + pixels[233] + " - " + pixels[4002] + " - " + pixels[11391]);
Run Code Online (Sandbox Code Playgroud)
注意:如果读取未压缩的同一文件的PNG版本,则值与预期的相同.
例如,三星Galaxy S4和三星Galaxy S5甚至具有与assets文件夹中存储的相同jpeg(运行相同测试活动)不同的像素.
像素[233]例如在s5上是-5205635但在s4上是-5336451.像素[4002]也稍微偏离.但是像素[11391]在这个jpeg图片上的两个设备上是相等的.
我正在尝试阅读用户上传的JPEG图像(任意)以在服务器应用程序中创建缩略图.系统在Windows7/Oracle Java 8u11中工作得很好,但我在服务器上的CentOS下有颜色模型的问题:
原始图片是:
http://studio-st.ru/media/portfolio/image/45
在Windows下的开发工作站上生成的缩略图绝对正确
Linux下的结果是颜色偏移的(Java 8u05上带红色,Java 8u11上有颜色偏移).这里没有提供,因为原始示例在现场,现在已修复.
更深入的调查显示问题在于读取图像 - Windows和Linux上的ImageIO.read(inputStream)返回具有完全相同参数的图像对象,但是同一图像(刚刚读取)的颜色探针getRGB(x,y)返回不同的值.
Linux中的颜色在Java 8u05和8u11上有所不同,8u05是"红色",8u11如上所示.
这与alpha通道无关 - 这个特殊的源图像是JPEG Type 5(TYPE_3BYTE_BGR),从Adobe Lightroom导出并转换为sRGB,没有任何其他技巧.
这也会影响当时导出的所有图像(事实上,此网站上的所有图像).
任何人都可以提供一些有关如何使其工作的建议(除了等待JDK的修复)?也许推荐备用库,可以在这里使用(EJB,存储在MongoDB中的数据,因此使用InputStreams获取数据 - 无文件系统访问).
谢谢!
UPD:问题似乎与Java8的新色彩管理模块有关 - 它不了解这种图像格式.切换到旧版CMM解决了这个问题.请在下面的正确评论中查看详细信息
我正在尝试用Java做一些图像处理.我使用ImageIO库来读写图像.我可以通过以下两种方式读取图像像素值(可能还有其他方法不知道).
使用BufferedImage的getRGB方法:
pixel = image.getRGB(x,y);
使用Raster的getSample方法:
WritableRaster raster = image.getRaster();
pixel = raster.getSample(x,y,0);
上述两种方法有何不同?