28 votes

Enregistrer une image à partir d'un WebView

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

2voto

sKv Points 66

Essayez ceci

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

1voto

Pourquoi ne pas simplement créer un bitmap à partir du fichier que vous avez obtenu sur le web en utilisant BitmapFactory et l'écrire ensuite au lieu de faire un snapshot de l' WebView ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X