在我的android应用程序中,我上传和下载JPEG图像。对于某些图像,BitmapFactory
对下载的图像进行降采样,但我不明白为什么以及如何阻止这样做。
上传和下载图像时,我记录了位图对象的大小:
Uploading image with size 3840x2160
Opening received image of size 2601584B degradation 0 decoded 384x216
因此,这里的图像宽度和高度在被BitmapFactory
解码后被除以10。
对于另一个图像,我从3480x4640移到217x290,所以除以16。我首先认为它可能是由图像dpi元数据引起的,因此我尝试使用以下代码在打开图像时强制使用它:
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 1 << degradation;
opts.inScaled = false;
opts.inDensity = 1;
opts.inTargetDensity = 1;
opts.inScreenDensity = 1;
final Bitmap original = BitmapFactory.decodeByteArray(data, 0, data.length, opts);
Log.d(Tags.IMAGES, "Opening received image of size " + data.length + " degradation " + degradation + " decoded " + original.getWidth() + "x" + original.getHeight());
如您所见,我给BitmapFactory
的字节数(2MB)与大图像而不是300x200px图像一致。因此我的上传代码和下载代码正确无误,在解码之前我拥有正确的数据。
我强迫所有密度以避免缩放,并且也禁用缩放,并且由于降级为0,因此我的样本大小为1,所以我不强制进行任何子采样。我仍然以很小的形象结束。并且BitmapFactory.decodeByteArray
迅速调用了本机代码,因此我无法真正对其进行调试。
我尝试过:
BitmapFactory.Options
对象中的所有密度都设置为0,但这并没有改变。 decodeByteArray
方法。答案 0 :(得分:0)
确定,经过更多调查,我发现了问题所在,这是由于代码的另一部分所致。由于应用程序中的竞争条件,我将图像和图像的缩影同时写入了相同的文件。因此,我最终得到了一个大图像文件,但其开头被一个小图像覆盖,这就是为什么BitmapFactory创建此小图像的原因。 抱歉,该问题不在代码的这一部分中,所以您找不到它。