在Android中至少有两种缩放位图的方法, 一种是在解码位图源时在“BitmapFactory.Options”中使用“inScaled,inDensity,inTargetDensity”。 另一种是在“Bitmap.createBitmap”中使用“Matrix”。
我很好奇这两种方法的区别是什么? 生成的位图的质量如何?那么内存使用情况呢? 等...
答案 0 :(得分:1)
将BitmapFactory
与正确的inScale选项配合使用,可以比使用矩阵比例Bitmap.createScaledBitmap()
或Bitmap.createBitmap()
更高效。但是,它更复杂。
查看How do I scale a streaming bitmap in-place without reading the whole image first?了解详情。
答案 1 :(得分:0)
没有“大”差异。虽然使用BitmapFactory.Options
的一个好处是,您可以检查Bitmap
的宽度/高度,而无需为实际的Bitmap
像素分配内存。
此外,您可以轻松查看哪个options BitmapFactory.Options
并将其与Bitmap.createBitmap()
进行比较。通常,BitmapFactory.Options
就像一个“工具”API,可以更轻松地解码和采样Bitmap
。
答案 2 :(得分:0)
我发现的一个区别是使用BitmapFactory的options.inSampleSize来缩放位图并不是那么精细,因为比例将是1 / inSampleSize,并且因为inSampleSize必须是一个整数,所以最终会缩放为1 / 2,1 / 3,1 / 4等,但没有比这更精细。
Bitmap.createScaledBitmap()
虽然内存密集程度更高,但允许更精细的缩放,分辨率高达1dp。
答案 3 :(得分:0)
使用 Bitmap.createBitmap ()
比使用 Bitmap.createScaledBitmap ()
更快。
使用 Bitmap.createBitmap ()
我们已经通过了位图创建设置,而 Bitmap.createScaledBitmap ()
的高度和宽度是动态计算的。
看例子:
/**
* Return a [Bitmap] representation of this [Drawable].
*
* If this instance is a [BitmapDrawable] and the [width], [height], and [config] match, the
* underlying [Bitmap] instance will be returned directly. If any of those three properties differ
* then a new [Bitmap] is created. For all other [Drawable] types, a new [Bitmap] is created.
*
* @param width Width of the desired bitmap. Defaults to [Drawable.getIntrinsicWidth].
* @param height Height of the desired bitmap. Defaults to [Drawable.getIntrinsicHeight].
* @param config Bitmap config of the desired bitmap. Null attempts to use the native config, if
* any. Defaults to [Config.ARGB_8888] otherwise.
*/
fun Drawable.toBitmap(
@Px width: Int = intrinsicWidth,
@Px height: Int = intrinsicHeight,
config: Config? = null
): Bitmap {
if (this is BitmapDrawable) {
if (config == null || bitmap.config == config) {
// Fast-path to return original. Bitmap.createScaledBitmap will do this check, but it
// involves allocation and two jumps into native code so we perform the check ourselves.
if (width == intrinsicWidth && height == intrinsicHeight) {
return bitmap
}
return Bitmap.createScaledBitmap(bitmap, width, height, true)
}
}
val (oldLeft, oldTop, oldRight, oldBottom) = bounds
val bitmap = Bitmap.createBitmap(width, height, config ?: Config.ARGB_8888)
setBounds(0, 0, width, height)
draw(Canvas(bitmap))
setBounds(oldLeft, oldTop, oldRight, oldBottom)
return bitmap
}