Ver la Versión Completa : Escalado Bitmap
pablogarcia013
11/03/13, 10:38:51
Buenas otra vez!
A ver si me podeis echar un cable con esto:
Tengo un bitmap dentro de un canvas, y me gustaría poder hacerlo mas grande y mas pequeño (haciendo el tipico gesto con los 2 dedos)
pero me encuentro con un problema, tengo mi funcion de redimensionarBmp y no hace nada, no me lo redimensiona: la funcion es la siguiente:
public Bitmap redimensionarBmp(Bitmap mBitmap, double newWidth, double newHeigth){
int width = mBitmap.getWidth();
int height = mBitmap.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeigth) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth,scaleHeight);
return Bitmap.createBitmap(mBitmap, 0, 0, width, height, matrix, false);
}
esta funcion si la uso en otras partes de la aplicacion funciona correctamente y lo escala al alto y ancho nuevo que le paso, cuando lo hago a la hora de pintarlo en el canvas no hace nada, he probado a llamarla de la siguiente manera: redimensionar(miBmp, 100,100);
para ver si funcionaba y reescalaba algo y nada...no hacia nada
Muchas gracias!
kriogeN
11/03/13, 12:41:49
Lo más rápido es usar inSampleSize con BitmapFactory, así lo hago yo siempre.
La putada es que la reducción siempre tiene que ser potencia de 2, es decir, no puedes hacer que la imagen sea 1/3 de la original, tiene que ser un 1/2 o 1/4.
Prueba con createScaledBitmap, aunque es algo más lento que usar inSampleSize.
Ni que decir tiene además que mucho cuidado trabajando con Bitmap, ya que su gestión de memoria es pésima, y a la que menos te lo esperes recibirás un VM Budget Out of Memory. Recomiendan que recicles las imágenes siempre que vayas a dejar de usarla, en tu caso la imagen original, porque ya vas a trabajar con la reducida. Pero aún así pueden seguir dando problemas.
Yo siempre meto los Bitmap en SoftReferences, desde que lo hago nunca más he vuelto a tener un problema de memoria con los Bitmap.
pablogarcia013
12/03/13, 09:19:58
Ni que decir tiene además que mucho cuidado trabajando con Bitmap, ya que su gestión de memoria es pésima, y a la que menos te lo esperes recibirás un VM Budget Out of Memory. Recomiendan que recicles las imágenes siempre que vayas a dejar de usarla, en tu caso la imagen original, porque ya vas a trabajar con la reducida. Pero aún así pueden seguir dando problemas.
Yo siempre meto los Bitmap en SoftReferences, desde que lo hago nunca más he vuelto a tener un problema de memoria con los Bitmap.
No entendi estos dos ultimos parrafos, si que es cierto que cuando agrando la imagen, me va un poco mas lenta la aplicacion, por no decir bastante mas lento, hay alguna manera de soluccionar eso? con eso que comentastes de pasarlo a SoftReferences?? me podias indicar como se hace eso?
Muchas gracias otra vez!
kriogeN
12/03/13, 11:54:50
EDITO: No había leído bien el post. Ahora ya si me he enterado de lo que quieres.
En cuanto a los párrafos que no entiendes, si no tienes problemas de memoria por ahora no te preocupes. En cuanto a lo de que te va lento cuando amplías la imagen, es no es problema de la memoria. Lo que ocurre es que redimensionas en píxeles el Bitmap y lógicamente al pintarlo le cuenta más.
Lo que tienes que hacer es hacer que al pintar se extienda, pero sin variar el tamaño físico del Bitmap. Luego te pongo un código de ejemplo.
EDITO 2: Usa esto:
drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)
Usando como Matrix la que calculas en el fragmento de código que has puesto.
pablogarcia013
13/03/13, 12:10:20
Gracias por el codigo, no me habia dado cuenta de que era ese :)
lo he probado y me lo hace bien lo de mover, pero no se me escala, el codigo que tengo ahora es:
Matrix m = this.redimensionarBmp(i.getBitmap(),i.getAncho()-i.getX(),i.getAlto()-i.getY(),i.getRotacion(),i.getX(),i.getY());
if(m!=null)canvas.drawBitmap(i.getBitmap(), m,null);
y mi redimensionarBmp es asi:
public Matrix redimensionarBmp(Bitmap mBitmap, double newWidth, double newHeigth,float rotacion,float dx, float dy){
if(newHeigth>0){
int width = mBitmap.getWidth();
int height = mBitmap.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeigth) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth,scaleHeight);
matrix.postRotate(rotacion);
matrix.setTranslate(dx, dy);
return matrix;
}else return null;
}
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.