我注意到,当在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图片上的两个设备上是相等的.
rha*_*oto 15
JPEG标准不要求解码器实现产生逐位相同的输出图像.不幸的是,指定解码器要求的标准文件ISO 10918-2显然不是免费在线提供的,但维基百科说:
... JPEG标准(和类似的MPEG标准)包括解码的一些精度要求,包括解码过程的所有部分(可变长度解码,逆DCT,去量化,输出的重归一化); 参考算法的输出不得超过:
- 每个像素分量最多1位差异
- 每个8×8像素块的低均方误差
- [等等.]
使用相同输入的不同解码器输出之间的差异通常是由于不同的内部精度水平,特别是在执行IDCT时.另一种可能的差异来源是平滑,它试图减少"块状"伪像.
和你一样,我希望这个设置inPreferQualityOverSpeed可以产生相同的输出,但实际上没有任何保证.我可以想到至少有两种方法可以让你在两部不同的手机上获得小变化:
BitmapFactory变更(例如可能inPreferQualityOverSpeed被破坏然后修复,反之亦然),或者BitmapFactory.即使标量浮点单元的差异也会导致差异,尤其是JIT编译产生实际的机器指令.鉴于标准中的摆动空间加上您的实验观察,似乎保证逐位协议的唯一方法是在您自己的应用程序中执行解码.也许你可以找到一些替代Android兼容的库.
| 归档时间: |
|
| 查看次数: |
2077 次 |
| 最近记录: |