PDA

Ver la Versión Completa : [ CONSULTA ] Problema imagen pixelada al guardala


canogt
18/02/14, 14:02:10
Buenas tardes a todos,

A ver si alguien me puede echar una manita.. :)
tengo un problema cuando recupero una foto de la galería o de la cámara y la guardo en la carpeta de mi aplicación.

Una vez guardada, cuando la recupero para visualizarla me aparece la imagen muy pixelada, ha perdido muchísima calidad y la letras son ilegibles.

Dejo el código que uso a ver si alguien me puede iluminar un poco.

...........
.......
try{
if (requestCode == SELECT_IMAGE)
if (resultCode == Activity.RESULT_OK) {
Uri selectedImage = data.getData();

if (selectedImage != null) {
image_view.setImageBitmap(getScaledBitmap(selected Image));
thumbnail = getScaledBitmap(selectedImage);
}
} else if (resultCode == Activity.RESULT_CANCELED) {
Toast.makeText(getBaseContext(), "Se ha cancelado la seleccion de foto " ,Toast.LENGTH_SHORT).show();
}
if(requestCode == TAKE_PICTURE)
if(resultCode == Activity.RESULT_OK){
Uri selectedImage = data.getData();
thumbnail = (Bitmap) data.getExtras().get("data");
image_view.setImageBitmap(thumbnail);
}
else if (resultCode == Activity.RESULT_CANCELED) {
Toast.makeText(getBaseContext(), "Se ha cancelado la captura de foto " ,Toast.LENGTH_SHORT).show();
}
} catch(Exception e){}
}

...............
..........

Y en otra parte del programa actúo con las variables que he cargado en este código


file = new File(folder,String.valueOf(NombreFoto) + ".jpg");
OutputStream f = null;
try {
f = new FileOutputStream(file);
thumbnail.compress(Bitmap.CompressFormat.PNG, 100, f);
f.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
}
}

Se que estoy comprimiendo la foto pero al darle al valor 100 no se guarda con buena calidad?
no he visto que la gente que use este método se queje de una perdida de calidad tan brutal como la que yo tengo.

Muchas gracias compis.

kriogeN
18/02/14, 14:05:26
La parte importante aquí y que no has puesto es lo que hace getScaledBitmap(selectedImage), ahí es donde puede ser que estés perdiendo calidad.

¿Puedes poner el código?

Y por cierto, la imagen que obtienes de la cámara es siempre de baja calidad (al menos si el desarrollo de la app de cámara se ajusta a lo que especifica Google, hay algunas como Camara360 que si la devuelven con buena calidad). Para obtenerla con buena calidad tienes que pasarle un fichero donde quieras que se almacene la foto, y luego en el onActivityResult abrir directamente ese fichero.

canogt
18/02/14, 14:17:50
La parte importante aquí y que no has puesto es lo que hace getScaledBitmap(selectedImage), ahí es donde puede ser que estés perdiendo calidad.

¿Puedes poner el código?

Y por cierto, la imagen que obtienes de la cámara es siempre de baja calidad (al menos si el desarrollo de la app de cámara se ajusta a lo que especifica Google, hay algunas como Camara360 que si la devuelven con buena calidad). Para obtenerla con buena calidad tienes que pasarle un fichero donde quieras que se almacene la foto, y luego en el onActivityResult abrir directamente ese fichero.

Gracias kriogeN, cuando ande por casa reviso el coódigo de getScaledBitmap y lo copio.

Con respecto a la cámara podría actuar de la siguiente manera?
hacer la foto, copiar físicamente el achivo foto que genera la cámara , copiarlo en mi carpeta y ahí de alguna manera tratarlo para que ocupe menos?.

Es que no se como se suele trabajar con las imágenes ...

Muchas gracias por tu tiempo

canogt
18/02/14, 17:03:05
La parte importante aquí y que no has puesto es lo que hace getScaledBitmap(selectedImage), ahí es donde puede ser que estés perdiendo calidad.

¿Puedes poner el código?

Y por cierto, la imagen que obtienes de la cámara es siempre de baja calidad (al menos si el desarrollo de la app de cámara se ajusta a lo que especifica Google, hay algunas como Camara360 que si la devuelven con buena calidad). Para obtenerla con buena calidad tienes que pasarle un fichero donde quieras que se almacene la foto, y luego en el onActivityResult abrir directamente ese fichero.

Copio el código

private Bitmap getScaledBitmap(Uri uri){
Bitmap thumb = null ;
try {
ContentResolver cr = getContentResolver();
InputStream in = cr.openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize=8;
thumb = BitmapFactory.decodeStream(in,null,options);
} catch (FileNotFoundException e) {
Toast.makeText(getBaseContext(), "Archivo no encontrado " ,Toast.LENGTH_SHORT).show();
}
return thumb ;
}


Un saludo

kriogeN
18/02/14, 19:04:48
El problema lo tienes en el inSampleSize = 8, le estás diciendo que te de una imagen 8 veces inferior. Es decir, si tu imagen es de 1024x768 la imagen final será de 128x96. Que viene siendo un tamaño de mierda.

Prueba quitando la línea.

canogt
18/02/14, 19:48:00
Muchísimas gracias kriogeN, con eso tengo resuelto el problema de las fotos de la galería. Voy a investigar a ver si puedo solucionar el de la cámara
Gracias de nuevo :)

canogt
19/02/14, 09:22:50
Y por cierto, la imagen que obtienes de la cámara es siempre de baja calidad (al menos si el desarrollo de la app de cámara se ajusta a lo que especifica Google, hay algunas como Camara360 que si la devuelven con buena calidad). Para obtenerla con buena calidad tienes que pasarle un fichero donde quieras que se almacene la foto, y luego en el onActivityResult abrir directamente ese fichero.


Al final lo de la cámara lo hice como me comentaste, pasandole el fichero donde tenia que escribir la imagen con el EXTRA_OUTPUT y luego la paso por mi método getScaledBitmap para
hacerla menos pesada.

Ahora tengo otro problema a ver si alguien le ha pasado, después de recuperar la imagen de la cámara y guardarla en la carpeta de mi aplicación, al mostrarla en un imageview en algunos móviles lo hace bien pero en otros no, por ejemplo en mi galaxy s3 me la deja rotada 90 º ...

Alguna idea?

Gracias.

kriogeN
19/02/14, 09:35:56
Eso es porque algunas aplicaciones de cámara no almacenan bien la rotación de la imagen, y entonces al abrirlas salen rotadas. Yo llevo trabajando 1 año en una aplicación de compartir fotografías y ya estos problemas me he enfrentado a todos.

Ahora cuando llegue a la oficina te posteo el código que uso yo para rotar correctamente la imagen.

canogt
19/02/14, 12:47:29
Eso es porque algunas aplicaciones de cámara no almacenan bien la rotación de la imagen, y entonces al abrirlas salen rotadas. Yo llevo trabajando 1 año en una aplicación de compartir fotografías y ya estos problemas me he enfrentado a todos.

Ahora cuando llegue a la oficina te posteo el código que uso yo para rotar correctamente la imagen.

Gracias KriogeN, he estado buscando información y he visto el problema pero poca información de como poder solucionarlo. Muchísimas gracias de nuevo por tu ayuda

canogt
22/02/14, 14:12:34
Eso es porque algunas aplicaciones de cámara no almacenan bien la rotación de la imagen, y entonces al abrirlas salen rotadas. Yo llevo trabajando 1 año en una aplicación de compartir fotografías y ya estos problemas me he enfrentado a todos.

Ahora cuando llegue a la oficina te posteo el código que uso yo para rotar correctamente la imagen.

Buenos días,

Podrías echarme una mano con esto? algún link o alguna idea para ir buscando, implemente un método que busca las orientaciones de las imágenes pero a veces me funciona y otras no. La verdad es que estoy atascado con esto :(

Un saludo y gracias