使用inDensity和inTargetDensity调整位图大小的问题

时间:2016-12-13 19:47:29

标签: android performance bitmap

我正在尝试使用inDensityinTargetDensity按照@colt-mcanlis12中解释的3指示来调整位图的大小

到目前为止,这么好,很好的文档,很棒的视频。问题是图像的最终尺寸对我来说没有意义。

例如,如果我使用以下值:

  • srcWidth为11774px,srcHeight为6340px
  • dstWidth为1440px,dstHeight为2392px

我正在使用的代码是:

options.inScaled = true;
options.inSampleSize = 8;
options.inDensity = srcWidth;
options.inTargetDensity = dstWidth * 8;
options.inSampleSize;
imageBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.image, options);

结果图像的宽度为70px,高度为38px,而不是1440x2393。

我试过没有使用inSampleSize,我得到了一个非常相似的结果。然后我假设问题出在inTargetDensityinDensity

我转到了文档,发现了以下内容:

  

强度气体

     

int inDensity   用于位图的像素密度...

据我所知,为了计算密度,我需要宽度,高度和显示尺寸,但在这种情况下显示尺寸对我来说没有意义,因为我只想计算inDensityinPixelDensity独立于显示尺寸。

那么,我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

我正在按照本书的Loading Large Bitmaps Efficiently进行操作,但遇到的问题是解码后的位图最终会比原始图像(options.outWidth / options.outHeight)具有更大的尺寸。

我注意到在“解码边界”步骤之后,inTargetDensity具有比inDensity更大的值,并最终发现是更大的解码位图的原因。不确定在这个领域玩任何不同的东西时会很有用......

但是在“解码边界”步骤之后设置options.inTargetDensity = options.inDensity,可以使位图按预期大小进行解码(根据您计算的inSampleSize)。

期待Romain Guy在Google I / O(2018)中宣布的“更直接”的API:D

答案 1 :(得分:0)

如果您只想在解码时调整图像大小,bundle config build.puma -- --with-opt-include=/usr/local/opt/openssl/include 选项就足够了,但是,由于原始图像和目标图像的纵横比不同,您无法通过{{获得预期结果直接1}}选项,您需要在调整大小后执行一些额外的裁剪操作。有关详细信息,请参阅以下指南: this comment in GitHub