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);