![]() |
|
| 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 |
«
Tema Anterior
|
Siguiente tema
»
|
|
Herramientas |
|
#1
|
||||
|
||||
|
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();
}
}
}
}
a ver si me podeis echar una mano. Muchas Gracias! |
|
|
|
#2
|
||||
|
||||
|
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. |
|
#3
|
||||
|
||||
|
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"/> |
|
#4
|
||||
|
||||
|
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..
|
|
#5
|
||||
|
||||
|
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. |
|
#6
|
||||
|
||||
|
con ese codigo ahora me da Permission denied exactamente me pone esto en el error:
java.io.FileNotFoundExcetion: /mnt/sdcard/imagen.png (Permission denied) |
|
#7
|
||||
|
||||
|
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();
}
}
}
|
|
#8
|
||||
|
||||
|
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.
|
| Respuesta |
Estás aquí
|
||||||
|
||||||
«
Tema Anterior
|
Siguiente tema
»
|
|
Hora actual: 21:46:21 (GMT +1)
HTCMania: líderes desde el 2007





