2012-01-13 4 views
6

Archivo de imagen I have.png almacenado como un recurso en mi aplicación de Android. En mi código, yo soy allocationg nueva instancia de Bitmap de esa imagen de la siguiente manera:Dimensiones incorrectas de la imagen en android cuando se usa Bitmap

Bitmap img = BitmapFactory.decodeResource(getResources(), R.drawable.imgName); 

Pero cuando leí las dimensiones de imagen del objeto de mapa de bits utilizando getWight() y getHeight() métodos,

int width = img.getWidth(); 
int height = img.getHeight(); 

Recibo diferentes resultados de la imagen original ... ¿Puede alguien explicarme qué es lo que me falta y cómo puedo recuperar el tamaño de la imagen?

(Mi proyecto se cumple con Android 2.2 - API 8)

Editar: Ok - descubrió cómo obtener las dimensiones reales: ajuste inJustDecodeBounds propiedad de la clase BitmapFactory.Options a la verdadera de la siguiente manera:

BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeResource(getResources(), R.drawable.imgName, options); 
    width = options.outWidth; 
    height = options.outHeight; 

el problema ahora es que el decodificador devuelve null cuando enviamos Options argumento, por lo que es necesario para decodificar otra vez como lo hacía antes (sin argumento Options ...) para recuperar Bitmap -bizarre ejemplo, ¿no es cierto?

Respuesta

3

Android escala su imagen para diferentes densidades (de una manera para diferentes resoluciones de pantalla y tamaños). Coloque una copia separada de su imagen en carpetas dibujables-ldpi, drawable-hdpi, drawable-xhdpi, dibujables.

+0

Gracias por su respuesta, pero ¿sabe si hay una forma de obtener el tamaño de imagen "real"? –

+0

@ET La forma más fácil es codificarla en forma rígida. De todos modos, sabrá el tamaño de la imagen que ha puesto en la carpeta dibujable. Francamente, no he intentado obtener el tamaño real. – manjusg

+1

No puedo usar esta solución ya que las imágenes son bastante dinámicas y pueden recuperarse del servicio web en el futuro. Además, tengo muchas imágenes :) –

8

Para obtener el uso de recursos exacta de la imagen:

BitmapFactory.Options o = new Options(); 
    o.inScaled = false; 
    Bitmap watermark = BitmapFactory.decodeResource(context.getResources(), id, o); 

Esto desactiva el escalado automático de densidad de pantalla.

Actualización: Estoy seguro de que ya se dio cuenta de esto, pero en JustDecodeBounds hace eso, encuentra las dimensiones. No obtendrás una imagen. Esa opción generalmente es para hacer escalas personalizadas. Se termina llamando decodeResource dos veces, la segunda ajuste de tiempo:

options.inJustDecodeBounds = false; 

y de realizar ajustes a las opciones con base en:

width = options.outWidth; 
height = options.outHeight; 
+0

Puede que no sea lo que el OP estaba buscando, pero seguro que me ayudó mucho, gracias. – r41n

+0

muchas gracias, esto fue increíblemente útil para mí! – noobcoder

Cuestiones relacionadas