8
votes

Différence entre les méthodes pour réduire un bitmap

Il y a au moins deux méthodes pour réduire un bitmap dans Android, L'une est d'utiliser "Indépendante, indensité, intargetdensens" dans "bitmapfactory.options" lors du décodage d'une source de bitmap. L'autre est d'utiliser une "matrice" dans "bitmap.createbitmap".

Qu'est-ce que je suis curieux, c'est quelle est la différence entre ces deux méthodes? Qu'en est-il de la qualité du bitmap produit? Et qu'en est-il de l'utilisation de la mémoire? etc ...


0 commentaires

4 Réponses :


0
votes

Il n'y a pas de "grosse" différence. Bien que, un bénéfice avec l'utilisation du bitmapfactory.Options est que vous pouvez vérifier la largeur / la hauteur de votre bitmap sans affecter la mémoire pour le fichier bitmap Les pixels.

Aussi, vous pouvez facilement voir quel Options bitPactFactory.OPTIONS a et comparez-le avec bitmap.createbitmap () . En général, bitmapfactory.Options est comme une API "outil" pour la création de décodage et d'échantillonnage bitmap s plus facile.


0 commentaires

1
votes

Utilisation de bitmapFactory avec les options d'insclature appropriées vous permettra d'être plus efficace de mémoire que d'utiliser bitmap.createscaledbap () ou bitmap.createbitmap () < / code> avec une échelle de matrice. Cependant, il est plus compliqué.

Découvrez Comment faire une échelle un bitmap streaming en place sans lire l'ensemble de l'image en premier? pour plus de détails.


0 commentaires

0
votes

Une différence que j'ai trouvée était qu'utiliser des options bitmapFactory`s.SampleSize à l'échelle des bitmaps n'est pas aussi granuleuse, car la balance sera 1 / insécapacité, et parce que l'insomplication doit être un nombre intégré, vous enverrez une mise à l'échelle comme 1 / 2, 1/3, 1/4, etc., mais rien de plus granulaire que ça.

bitmap.createscaledbatimap () , bien que plus de mémoire intensive, permet une mise à l'échelle plus granuleuse, une résolution maximale de 1DP.


1 commentaires

Vous avez oublié la méthode Indensité + Intargeddensens d'Inditive + qui permet une mise à l'échelle granulaire. Il vous suffit de connaître les grandeurs d'échelle et de travailler avec insécapacité.



0
votes

Utilisation de bitmap.createbitmap () code> devient plus rapide que d'utiliser bitmap.createscaledbap () code>.

Utilisation de bitmap.createbitmap () Code> Nous ont déjà passé les paramètres de création bitmap, tandis qu'avec bitmap.createscaledbapAmap () code> Hauteur et la largeur sont calculés de manière dynamique. P>

voir l'exemple: P>

/**
 * 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
}


0 commentaires