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

标签 android performance bitmap

我正在尝试在 @colt-mcanlis 之后使用 inDensityinTargetDensity 调整位图大小' 在 1 解释说明, 23 .

到目前为止一切都很好,很好的文档,很棒的视频。问题是图像的最终尺寸对我来说毫无意义。

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

  • 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 上。

我查看了文档并发现了以下内容:

inDensity

int inDensity The pixel density to use for the bitmap...

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

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

最佳答案

我正在关注 Loading Large Bitmaps Efficiently按照书上的说法,但遇到了解码位图最终具有比原始图像更大的尺寸(options.outWidth/options.outHeight)的问题。

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

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

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

关于android - 使用 inDensity 和 inTargetDensity 调整位图大小的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129354/

相关文章:

javascript - Web worker 在传递具有数组缓冲区的大量对象时使 Chrome 选项卡崩溃

c# - 位图的 OutOfMemoryException 错误

delphi - 使用 Delphi XE 从资源加载时如何保留 PNGImage 蒙版

java - Ion w/Cloudflare free SSL(带 SNI)失败

java - 无法通过 Intent 传递 Parcelable

performance - 优化排除 PostgreSQL 中特定用户的触发器

mysql - 同一表在不同数据库中不使用索引

c++ - 解析位图文件时,如何替换WORD和DWORD数据类型?

java.lang.RuntimeException : java.net.UnknownHostException:主机未解析:

Android parcelable 和 Intent : redBundle: bad magic number