web-dev-qa-db-de.com

Android/Java: Speichern eines Byte-Arrays in einer Datei (.jpeg)

Ich entwickle eine Anwendung für Android, und ein Teil der Anwendung muss Bilder aufnehmen und auf der SD-Karte speichern. Die onPictureTaken-Methode hat ein Byte-Array mit den Daten des erfassten Bildes zurückgegeben. 

Alles was ich tun muss, ist das Byte-Array in eine JPEG-Image-Datei zu speichern. Ich habe versucht, dies mit Hilfe von BitmapFactory.decodeByteArray (um eine Bitmap zu erhalten) und dann bImage.compress (auf einen OutputStream), einen einfachen OutputStream und einen BufferedOutputStream auszuführen. Alle drei dieser Methoden scheinen mir den gleichen komischen Fehler zu verursachen. Mein Android-Handy (8-Megapixel-Kamera und ein anständiger Prozessor) scheint das Foto zu speichern (die Größe scheint korrekt zu sein), aber auf eine beschädigte Weise (das Bild wird in Scheiben geschnitten und jede Scheibe wird verschoben; oder ich bekomme fast horizontale Linien mit verschiedenen Farben). ; Das Komische ist, dass ein Android-Tablet mit einer 5-Megapixel-Kamera und einem schnellen Prozessor das Bild anscheinend richtig zu speichern scheint. 

Ich dachte, vielleicht kann der Prozessor nicht mit dem Speichern großer Bilder mithalten, da ich nach ca. 3 Bildern OutOfMemory-Ausnahmen bekam (sogar bei einer Komprimierungsqualität von 40). Aber wie macht es die eingebaute Kamera-App und viel schneller? Ich bin ziemlich sicher (vom Debugging), dass der OutputStream alle Daten (Bytes) schreibt und es sollte in Ordnung sein, aber es ist immer noch beschädigt.

*** Was ist der beste/schnellste Weg, um ein Byte-Array in einer JPEG-Datei zu speichern?

Vielen Dank im Voraus, Mark

code, den ich ausprobiert habe (und einige andere geringfügige Variationen):

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

und

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

Alles was ich tun muss, ist das Byte-Array in eine .jpeg-Image-Datei zu speichern.

Schreiben Sie es einfach in eine Datei. Es ist bereits im JPEG-Format. Hier ist eine Beispielanwendung, die dies demonstriert . Hier ist das Schlüsselstück des Codes:

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

Dieser Code eignet sich hervorragend zum Speichern von Bildern aus Byte [] ... Beachten Sie, dass "Bild" hier Byte [] .... als "Byte [] Bild" als Parameter in eine Funktion aufgenommen wird.

    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