studio reales proyectos programacion libro introducción incluye herramientas fundamentos fuente español código con avanzado aplicaciones java android canvas webview android-bitmap

java - reales - libro de android studio en español pdf



Guardar imagen de WebView (2)

Trataré de ser breve, así que estoy haciendo esta aplicación, donde la imagen se carga a una vista Webview personalizada, dibuje un lienzo y guárdelo. Ahora ejecuto con éxito todo, hasta el punto de guardarlo. He probado muchos métodos diferentes, pero ninguno funcionó.

Guardo una imagen sin editar de Url con:

public void DownloadFromUrl(String fileName) { //this is the downloader method try { URL url = new URL(wv2.getUrl()); //you can write here any link File file = new File(fileName); Canvas canvas = new Canvas(); wv2.draw(canvas ); long startTime = System.currentTimeMillis(); Log.d("ImageManager", "download begining"); Log.d("ImageManager", "download url:" + url); Log.d("ImageManager", "downloaded file name:" + fileName); URLConnection ucon = url.openConnection(); InputStream is = ucon.getInputStream(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(50); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte) current); } FileOutputStream fos = new FileOutputStream(file); fos.write(baf.toByteArray()); fos.close(); Log.d("ImageManager", "download ready in" + ((System.currentTimeMillis() - startTime) / 1000) + " sec"); } catch (IOException e) { Log.d("ImageManager", "Error: " + e); } }

Mi función de dibujo en la vista webview personalizada se ve así:

@Override protected void onDraw(Canvas canvas) { super.onDraw (canvas); /*code that draws different stuff*/ }

Para mostrar la imagen editada, creo que necesito usar esto:

canvas = new Canvas(mutableBitmap); wv2.draw(canvas); tstImage.setImageBitmap(mutableBitmap);

Pero, de nuevo, no sé cómo combinar el lienzo en la imagen. ¿Debo usar Drawing Cache? ¿Si es así, entonces cómo?

[ACTUALIZAR]

Está bien, así que he logrado guardar la imagen editada usando este código

wv2.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(wv2.getDrawingCache()); wv2.setDrawingCacheEnabled(false); tstImage.setImageBitmap(bitmap); SaveImage(bitmap);

Donde SaveImage:

private void SaveImage(Bitmap finalBitmap) { String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/Pictures/"); myDir.mkdirs(); String fname = "Image-"+ count +".jpg"; File file = new File (myDir, fname); if (file.exists ()) file.delete (); try { FileOutputStream out = new FileOutputStream(file); finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } }

Mi único problema es que la imagen que obtengo es lo que se mostró en la vista web en ese momento. Entonces, si amplío la imagen, guarda solo una parte de ella.

[ACTUALIZACIÓN 2]

He modificado una de las respuestas en busca de una solución, esto es lo que he escrito. No se muestra ninguna imagen.

File imageFile = new File("file://" + Environment.getExternalStorageDirectory() + "/Pictures/" + count + ".jpg"); String location = new String("file://" + Environment.getExternalStorageDirectory() + "/Pictures/" + count + ".jpg"); if(imageFile.exists()){ Bitmap myBitmap = BitmapFactory.decodeFile(location); Bitmap mutableBitmap = myBitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(mutableBitmap); wv2.draw(canvas); tstImage.setImageBitmap(mutableBitmap); }


¿Por qué no simplemente creas un mapa de bits del archivo que obtuviste de la web usando BitmapFactory y luego lo escribes en lugar de tomar una instantánea de WebView ?


prueba esto

Bitmap workingBitmap = Bitmap.createBitmap(chosenFrame); Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas canvas = new Canvas(mutableBitmap);