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". P>
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 ... p>
4 Réponses :
Il n'y a pas de "grosse" différence. Bien que, un bénéfice avec l'utilisation du Aussi, vous pouvez facilement voir quel Options bitmapfactory.Options code> est que vous pouvez vérifier la largeur / la hauteur de votre
bitmap code> sans affecter la mémoire pour le fichier
bitmap code > Les pixels. p>
bitPactFactory.OPTIONS code>
a et comparez-le avec bitmap.createbitmap () code>. En général,
bitmapfactory.Options code> est comme une API "outil" pour la création de décodage et d'échantillonnage
bitmap code> s plus facile. P>
Utilisation de 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. P> bitmapFactory code> avec les options d'insclature appropriées vous permettra d'être plus efficace de mémoire que d'utiliser
bitmap.createscaledbap () code> ou
bitmap.createbitmap () < / code> avec une échelle de matrice. Cependant, il est plus compliqué. P>
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. P>
bitmap.createscaledbatimap () code>, bien que plus de mémoire intensive, permet une mise à l'échelle plus granuleuse, une résolution maximale de 1DP. P>
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é.
Utilisation de Utilisation de bitmap.createbitmap () Code> Nous ont déjà passé les paramètres de création bitmap, tandis qu'avec voir l'exemple: P> bitmap.createbitmap () code> devient plus rapide que d'utiliser
bitmap.createscaledbap () code>.
bitmap.createscaledbapAmap () code> Hauteur et la largeur sont calculés de manière dynamique. 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
}