J'essaierai d'être bref - je suis en train de créer cette application, où l'image est téléchargée dans un fichier personnalisé. Webview
, dessiner le canevas et le sauvegarder. Maintenant, j'exécute tout avec succès, jusqu'au moment de l'enregistrement. J'ai essayé beaucoup de méthodes différentes, mais aucune n'a fonctionné.
Je sauvegarde l'image non éditée de Url
avec :
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);
}
}
Ma fonction de dessin en custom webview
ressemble à ça :
@Override
protected void onDraw(Canvas canvas) {
super.onDraw (canvas);
/*code that draws different stuff*/
}
Pour afficher l'image éditée, je pense que je dois utiliser ceci :
canvas = new Canvas(mutableBitmap);
wv2.draw(canvas);
tstImage.setImageBitmap(mutableBitmap);
Mais encore une fois, je ne sais pas comment fusionner la toile dans l'image. Dois-je utiliser Drawing Cache ? Si oui, comment ?
[MISE À JOUR]
Ok, j'ai réussi à sauvegarder l'image modifiée en utilisant ce code
wv2.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(wv2.getDrawingCache());
wv2.setDrawingCacheEnabled(false);
tstImage.setImageBitmap(bitmap);
SaveImage(bitmap);
Où 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();
}
}
Mon seul problème est que l'image que j'obtiens est celle qui était affichée dans la vue Web à ce moment-là. Ainsi, si je zoome sur l'image, seule une partie de celle-ci est enregistrée.
[MISE À JOUR 2]
J'ai modifié une des réponses à la recherche d'une solution, voici ce que j'ai écrit. Aucune image ne s'affiche.
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);
}