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

Respuesta
 
Herramientas
  #1  
Viejo 04/03/13, 10:29:17
Array

[xs_avatar]
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
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
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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
Array

[xs_avatar]
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
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
Array

[xs_avatar]
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
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
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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
Array

[xs_avatar]
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
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
Array

[xs_avatar]
pablogarcia013 pablogarcia013 no está en línea
Miembro del foro
 
Fecha de registro: ene 2013
Localización: Madrid
Mensajes: 148
Modelo de smartphone: Samgung Galaxy s2
Tu operador: Orange
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
Array

[xs_avatar]
kriogeN kriogeN no está en línea
Colaborador/a
· Votos compra/venta: (1)
 
Fecha de registro: oct 2010
Localización: Murcia
Mensajes: 4,637
Modelo de smartphone: Samsung Galaxy S7 Edge SM-G935F
Tu operador: Vodafone
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   Portal | Indice > Todo sobre Android > Programación y Desarrollo para Android



Hora actual: 23:38:22 (GMT +1)



User Alert System provided by Advanced User Tagging (Lite) - vBulletin Mods & Addons Copyright © 2025 DragonByte Technologies Ltd.

Contactar por correo / Contact by mail / 邮件联系 /