缩放位图的方法之间的区别

时间:2010-10-20 09:27:17

标签: android matrix bitmap scale

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

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

4 个答案:

答案 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
}

Source