Home Menu

Menu



Programación y Desarrollo para Android Subforo exclusivo para temas de programación de software para PDAs y desarrollo de aplicaciones, interfaces, etc bajo Android


 
Herramientas
  #1  
Viejo 04/03/13, 10:29:17
Avatar de pablogarcia013
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
Mensajes: 148
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
Canvas a Jpeg

Buenos dias!

Tengo una dudilla sobre como guardar un canvas como una imagen (jpeg o png eso me es indiferente)

El caso es que tengo un canvas con imagenes dentro (Bitmap que he abierto previamente).

He encontrado documentacion al respecto pero no consigo realizarlo mi codigo es el siguiente :
Código:
public void onClickGuardarImagen(View v){
		
		Canvas canvas = null;
		FileOutputStream fos = null;
		Bitmap bmpBase = null;
		bmpBase = Bitmap.createBitmap(800,400,Bitmap.Config.ARGB_8888);
		canvas = new Canvas();
                File f = new File("imagen.png");
	//dibujo todas las imagenes que tengo en el canvas.
		try{
			fos=new FileOutputStream(f);
			bmpBase.compress(Bitmap.CompressFormat.PNG, 100, fos);
			
			fos.flush();
			fos.close();
			fos=null;
		}catch(IOException e){
			e.printStackTrace();
			Toast.makeText(getApplicationContext(), "Error al guardar la imagen", Toast.LENGTH_LONG).show();
		}
		finally{
			if(fos!=null){
				try{
					fos.close();
					fos=null;
				}catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
Debugeando me salta el error y se me mete en el cacth cuando hago: fos=new FileOutputStream(f);

a ver si me podeis echar una mano.

Muchas Gracias!
Responder Con Cita


  #2  
Viejo 04/03/13, 12:00:15
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Mira a ver que información te da exactamente el IOException, lo más probable que no tengas permisos para guardar donde estás tratando de hacerlo o que no hay espacio. También decirte que puedes pasarle directamente al FileOutputStream la ruta y así te ahorras el File:

fos=new FileOutputStream("imagen.png");

Luego comentarte 2 cosas más, porque precisamente en el proyecto que estoy haciendo ahora mismo hago todo este tipo de cosas:

Es muchísimo mejor (en todo, tamaño que ocupa y calidad final de la imagen), guardarla como JPEG 80% que PNG 100%. Hablamos casi de 15 veces la diferencia de tamaño.

Y con respecto al Canvas, no puedes (al menos no he encontrado la forma, precisamente hace un par de días estuve buscando) guardar un Canvas ya existente en un Bitmap, tienes que hacerlo ya antes de empezar a pintar en el Canvas.

La forma de hacerlo es construyendo el Canvas como:

canvas = new Canvas(bmpBase);

Supongo que habrá una forma de pintar un Canvas en otro Canvas, y este último Canvas ya establecerle el Bitmap, así podrías guardar un Canvas ya existente. Pero tampoco encontré la forma (no le dedique mucho tiempo la verdad), si alguien sabe como hacerlo que comente en este hilo y de paso me ayuda a mi.
Responder Con Cita
  #3  
Viejo 04/03/13, 12:21:46
Avatar de pablogarcia013
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
Mensajes: 148
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
He visto el IOException y me pone: Permission denied.
Me gustaria guardarlo en una carpeta llamada por ejemplo "Imagenes Aplicacion" en la tarjeta sd y en el manifest tengo puesto <uses-permission android:name="android.permission.WRITE_EXTERNAL_ST ORAGE"/>
Responder Con Cita
  #4  
Viejo 04/03/13, 12:26:22
Avatar de pablogarcia013
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
Mensajes: 148
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
Lo he vuelvo a probar y me pone ahora, Read-only file system, no se por que antes e ponia Persmission denied y ahora esto..
Responder Con Cita
  #5  
Viejo 04/03/13, 13:38:37
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
Prueba con esto:

fos=new FileOutputStream(Environment.getExternalStorageDir ectory().getAbsolutePath()+File.separator+"imagen. png");

EDIT: No se porqué me pone los caracteres separados, va todo junto, sin espacios.
Responder Con Cita
  #6  
Viejo 04/03/13, 13:44:36
Avatar de pablogarcia013
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
Mensajes: 148
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
con ese codigo ahora me da Permission denied exactamente me pone esto en el error:
java.io.FileNotFoundExcetion: /mnt/sdcard/imagen.png (Permission denied)
Responder Con Cita
  #7  
Viejo 04/03/13, 13:58:01
Avatar de pablogarcia013
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
Mensajes: 148
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
Mencionado: 0 comentarios
Tagged: 0 hilos
Ya esta soluccionado, con ese codigo que me dijsite si que funciona, lo he probado en el movil y funciona correctamente, seguramente pueda ser que al probarlo en el emulador este no tenga permisos de escritura en el sdcard?
He modificado un poco el codigo para que las imagenes me las cree en una carpeta propia, o pongo por si a alguien le ocurria lo mismo:

Código:
ile sdCard = Environment.getExternalStorageDirectory();
		File dir = new File (sdCard.getAbsolutePath() + "/CarpetaPropia");
		if(!dir.exists())
			dir.mkdirs();
		File file = new File(dir, "mi_imagen.png");
		FileOutputStream fos = null;
		Canvas canvas = null;
		Bitmap bmpBase = null;
		bmpBase = Bitmap.createBitmap(800,400,Bitmap.Config.ARGB_8888);
		canvas = new Canvas(bmpBase);
		//aqui pinto todos los componentes que quiera en el canvas, en mi caso las imagenes.
		try{
			fos=new FileOutputStream(file);
			bmpBase.compress(Bitmap.CompressFormat.JPEG, 100, fos);
			
			fos.flush();
			fos.close();
			fos=null;
		}catch(IOException e){
			e.printStackTrace();
			Log.e("MYAPP", "exception: " + e.getMessage());
			Toast.makeText(getApplicationContext(), "Error al guardar la imagen", Toast.LENGTH_LONG).show();
		}
		finally{
			if(fos!=null){
				try{
					fos.close();
					fos=null;
				}catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
Responder Con Cita
  #8  
Viejo 04/03/13, 14:32:59
Avatar de kriogeN
kriogeN kriogeN no está en línea
Colaborador/a
Mensajes: 4,637
Compra y venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Versión de ROM: CM13 - CM 11
Tu operador: Vodafone
Mencionado: 60 comentarios
Tagged: 3 hilos
En el emulador no te funcionará porque no le has creado una SD, eso se hace desde las opciones antes de iniciar la emulación.
Responder Con Cita
Respuesta

Estás aquí
Regresar   HTCMania > Todo sobre Android > Programación y Desarrollo para Android


Reglas de Mensajes
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Las caritas están On
Código [IMG] está On
Código HTML está Off

Saltar a Foro



Hora actual: 21:46:21 (GMT +1)

Cookies
Powered by vBulletin™
Copyright © vBulletin Solutions, Inc. All rights reserved.
 
HTCMania: líderes desde el 2007