web-dev-qa-db-fra.com

Android/Java: enregistrement d'un tableau d'octets dans un fichier (.jpeg)

Je développe une application pour Android, et une partie de l'application doit prendre des photos et les enregistrer sur la carte SD. La méthode onPictureTaken a renvoyé un tableau d'octets avec les données de l'image capturée. 

Tout ce que j'ai à faire est de sauvegarder le tableau d'octets dans un fichier image .jpeg. J'ai tenté de le faire à l'aide de BitmapFactory.decodeByteArray (pour obtenir un bitmap), puis de bImage.compress (dans un OutputStream), d'un plain OutputStream et d'un BufferedOutputStream. Ces trois méthodes semblent me donner le même bogue étrange. Mon téléphone Android (appareil photo 8 MP et processeur convenable) semble enregistrer la photo (la taille semble correcte), mais de manière corrompue (l'image est découpée en tranches et chaque tranche est décalée; ou j'obtiens simplement des lignes presque horizontales de différentes couleurs) ; Et ce qui est étrange, c'est qu'une tablette Android avec un appareil photo 5MP et un processeur rapide, semble enregistrer correctement l'image. 

Je me suis donc dit que le processeur ne pouvait peut-être pas enregistrer de grandes images, car j'ai des OutOfMemory Exceptions après environ 3 images (même avec une qualité de compression de 40). Mais alors, comment fonctionne l'application intégrée dans l'appareil photo, et beaucoup plus rapide aussi? Je suis à peu près sûr (à partir de debug) que OutputStream écrit toutes les données (octets) et que tout devrait bien se passer, mais elles sont toujours corrompues.

*** En bref, quel est le moyen le plus rapide/le meilleur (qui fonctionne) de sauvegarder un tableau d’octets dans un fichier jpeg?

Merci d'avance, Mark

j'ai essayé le code (et quelques autres variations):

    try {
        Bitmap image = BitmapFactory.decodeByteArray(args, 0, args.length);
        OutputStream fOut = new FileOutputStream(externalStorageFile);
        long time = System.currentTimeMillis();
        image.compress(Bitmap.CompressFormat.JPEG,
                jpegQuality, fOut);
        System.out.println(System.currentTimeMillis() - time);
        fOut.flush();
        fOut.close();
    } catch (Exception e) {
    }

et

    try {
        externalStorageFile.createNewFile();
        FileOutputStream fos = new FileOutputStream(externalStorageFile);
        fos.write(args);
        fos.flush();
        fos.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
27
Mark

Tout ce que j'ai à faire est de sauvegarder le tableau d'octets dans un fichier image .jpeg.

Il suffit de l'écrire dans un fichier. C'est déjà au format JPEG. Voici un exemple d’application le prouvant . Voici l'élément clé du code:

class SavePhotoTask extends AsyncTask<byte[], String, String> {
    @Override
    protected String doInBackground(byte[]... jpeg) {
      File photo=new File(Environment.getExternalStorageDirectory(), "photo.jpg");

      if (photo.exists()) {
            photo.delete();
      }

      try {
        FileOutputStream fos=new FileOutputStream(photo.getPath());

        fos.write(jpeg[0]);
        fos.close();
      }
      catch (Java.io.IOException e) {
        Log.e("PictureDemo", "Exception in photoCallback", e);
      }

      return(null);
    }
}
53
CommonsWare

Ce code est parfait pour enregistrer une image dans la mémoire, à partir d'octet [] ... Notez que "image" est ici un octet [] .... pris comme "octet [] image" comme paramètre dans une fonction.

    File photo=new File(Environment.getExternalStorageDirectory(), "photo.jpg");

    if (photo.exists()) {
        photo.delete();
    }

    try {
        FileOutputStream fos=new FileOutputStream(photo.getPath());
        Toast.makeText(this, photo.getPath(), Toast.LENGTH_SHORT).show();
        fos.write(image);
        fos.close();
    }
    catch (Java.io.IOException e) {
        Log.e("PictureDemo", "Exception in photoCallback", e);
    }
}
0
Ali Raza