Android 缩放位图的不同方法

Android 缩放位图的不同方法,android,matrix,bitmap,scale,Android,Matrix,Bitmap,Scale,Android中至少有两种缩放位图的方法, 一种是在解码位图源时使用“BitmapFactory.Options”中的“inScaled、inDensity、inTargetDensity”。 另一种是在“Bitmap.createBitmap”中使用“矩阵” 我好奇的是这两种方法之间的区别是什么? 生成的位图的质量如何?内存使用情况如何? 等等。没有“大”区别。尽管如此,使用位图工厂.Options的一个好处是,您可以检查位图的宽度/高度,而无需为实际位图的像素分配内存 此外,您还可以很容易地

Android中至少有两种缩放位图的方法, 一种是在解码位图源时使用“BitmapFactory.Options”中的“inScaled、inDensity、inTargetDensity”。 另一种是在“Bitmap.createBitmap”中使用“矩阵”

我好奇的是这两种方法之间的区别是什么? 生成的位图的质量如何?内存使用情况如何? 等等。

没有“大”区别。尽管如此,使用
位图工厂.Options
的一个好处是,您可以检查
位图的宽度/高度,而无需为实际
位图的像素分配内存


此外,您还可以很容易地看到哪些具有,并将其与
Bitmap.createBitmap()
进行比较。一般来说,
BitmapFactory.Options
就像一个“工具”API,使解码和采样
Bitmap
更容易。

使用
BitmapFactory
和适当的inScale选项将比使用
Bitmap.createScaledBitmap()
Bitmap.createBitmap()更节省内存
带有矩阵刻度。然而,它更为复杂


查看详细信息。

我发现的一个区别是,使用BitmapFactory的选项.inSampleSize缩放位图没有那么精细,因为缩放比例将是1/inSampleSize,并且由于inSampleSize必须是整数,所以最终的缩放比例类似于1/2、1/3、1/4等,但没有比这更精细的了


Bitmap.createScaledBitmap()
,虽然内存更密集,但允许更精细的缩放,分辨率高达1dp。

使用
Bitmap.createBitmap()
比使用
Bitmap.createScaledBitmap()
更快


使用
Bitmap.createBitmap()
我们已经通过了位图创建设置,而使用
Bitmap.createScaledBitmap()
动态计算高度和宽度

请参见示例:

/**
*返回此[Drawable]的[Bitmap]表示形式。
*
*如果此实例是[BitmapDrawable],且[width]、[height]和[config]匹配,则
*将直接返回基础[Bitmap]实例。如果这三个属性中的任何一个不同
*然后创建一个新的[位图]。对于所有其他[Drawable]类型,将创建一个新的[Bitmap]。
*
*@param width所需位图的宽度。默认为[Drawable.getIntrinsicWidth]。
*@param height所需位图的高度。默认为[Drawable.getIntrinsicHeight]。
*@param config所需位图的位图配置。Null尝试使用本机配置,如果
*任何。否则默认为[Config.ARGB_8888]。
*/
有趣的Drawable.toBitmap(
@Px宽度:Int=intrinsicWidth,
@Px高度:Int=intrinsicHeight,
config:config?=null
):位图{
if(这是可位图绘制的){
if(config==null | | bitmap.config==config){
//返回原始.Bitmap.createScaledBitmap的快速路径将执行此检查,但
//涉及分配和两次跳转到本机代码,因此我们自己执行检查。
如果(宽度==内部宽度和高度==内部八){
返回位图
}
返回位图.createScaledBitmap(位图、宽度、高度、真值)
}
}
val(oldLeft、oldTop、oldRight、oldBottom)=边界
val bitmap=bitmap.createBitmap(宽度、高度、配置?:config.ARGB_8888)
立根(0,0,宽度,高度)
绘制(画布(位图))
收进边界(oldLeft、oldTop、oldRight、oldBottom)
返回位图
}

您忘记了inScaled+inDensity+inTargetDensity方法,该方法允许颗粒缩放。您只需知道标度大小,然后使用inSampleSize。