BitmapFactory意外对图像进行降采样

时间:2018-08-02 10:39:28

标签: android android-bitmap bitmapfactory

在我的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,但这并没有改变。
  • 在上传之前设置位图的密度,没有任何效果(最初这两个子采样图像的密度为420)。
  • 在完全解码位图之前(通过justDecodeBounds)读取位图的大小,并且以这种方式返回的大小也太小。
  • 即使图像太小,也不能将任何选项传递给decodeByteArray方法。

1 个答案:

答案 0 :(得分:0)

确定,经过更多调查,我发现了问题所在,这是由于代码的另一部分所致。由于应用程序中的竞争条件,我将图像和图像的缩影同时写入了相同的文件。因此,我最终得到了一个大图像文件,但其开头被一个小图像覆盖,这就是为什么BitmapFactory创建此小图像的原因。 抱歉,该问题不在代码的这一部分中,所以您找不到它。