2013-05-20 4 views
13

Gibt es eine Möglichkeit, Byte-Array zu drehen, ohne es in Bitmap zu decodieren?Byte-Array von JPEG nach onPictureTaken drehen

Derzeit in jpeg PictureCallback schreibe ich nur Byte-Array direkt in Datei. Aber Bilder werden gedreht. Ich möchte sie drehen, ohne zu entschlüsseln, um Bitmap mit der Hoffnung zu machen, dass dies mein Gedächtnis konserviert.

BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeByteArray(data, 0, data.length, o); 

    int orientation; 
    if (o.outHeight < o.outWidth) { 
     orientation = 90; 
    } else { 
     orientation = 0; 
    } 

    File photo = new File(tmp, "demo.jpeg"); 

    FileOutputStream fos; 
    BufferedOutputStream bos = null; 
    try { 
     fos = new FileOutputStream(photo); 
     bos = new BufferedOutputStream(fos); 
     bos.write(data); 
     bos.flush(); 
    } catch (IOException e) { 
     Log.e(TAG, "Failed to save photo", e); 
    } finally { 
     IOUtils.closeQuietly(bos); 
    } 
+0

Hallo. Hast du das geschafft? Danke, Mann. – Paul

+0

Leider nicht. –

+1

@Paul: siehe http://StackOverflow.com/a/16655188/192373 –

Antwort

1

Ich glaube nicht, dass es eine solche Möglichkeit gibt. Die Reihenfolge der Bytes hängt von der Bildcodierung ab (png, jpeg). Sie sind also gezwungen, das Bild zu dekodieren, um etwas damit zu tun.

+0

Aber Android Dokumentation besagt, dass 'öffentliche endgültige void takePicture (Camera.ShutterCallback Shutter, Camera.PictureCallback roh, Camera.PictureCallback jpeg)'. Also werde ich in 'Camera.PictureCallback jpeg' immer JPEG Bilddaten erhalten. –

+1

Aber es gibt keine Methode, um JPEG zu drehen. Das Beste, was Sie tun können, ist, Exif-Daten zu ändern. Nicht alles unterstützt dies und es wird nicht rotieren. –

2

Sie können die JPEG-Drehung über den Exif-Header festlegen, ohne sie zu decodieren. Dies ist die effizienteste Methode, aber einige Viewer zeigen möglicherweise noch ein gedrehtes Bild an.

Alternativ können Sie JPEG lossless rotation verwenden. Leider sind mir keine freien Java-Implementierungen dieses Algorithmus bekannt.

Update auf SourceForge gibt es eine Java-Open-Source-Klasse LLJTran. Der Android-Port ist unter GitHub.

+1

Haben Sie LLJtran für Android ausprobiert? Es dauert 16s, um 2M JPEG-Datei zu drehen, die auf dem Samsung Galaxy S1 getestet wurde. Wie auch immer, um die Prozesszeit zu verkürzen? – Yeung

+0

Oh, schade. Danke für das Teilen. Ich werde es in der Freizeit anschauen. –

+0

Bitte schauen Sie auf [this] (http://stackoverflow.com/a/25603218/1099884), um zu sehen, ob ich mit der Bibliothek etwas falsch gemacht habe. – Yeung

0

Versuchen Sie dies. Es wird den Zweck lösen.

Bitmap storedBitmap = BitmapFactory.decodeByteArray(data, 0, data.length, null); 

Matrix mat = new Matrix();       
mat.postRotate("angle"); // angle is the desired angle you wish to rotate    
storedBitmap = Bitmap.createBitmap(storedBitmap, 0, 0, storedBitmap.getWidth(), storedBitmap.getHeight(), mat, true); 
+4

Bitte lesen Sie die Frage - Ich muss Byte-Array drehen, ohne es in Bitmap zu dekodieren. –

+0

klar erwähnt, dass die Rotation ohne Decodierung erfolgen muss. – therealprashant