2013-05-20 7 views
13

Czy istnieje sposób na obrócenie tablicy bajtów bez jej dekodowania do bitmapy?Obróć tablicę bajtów JPEG po onPictureTaken

Obecnie w jpeg PictureCallback po prostu piszę tablicę bajtów bezpośrednio do pliku. Ale obrazy są obracane. Chciałbym je obrócić bez dekodowania do bitmapy z nadzieją, że to pozwoli mi zachować pamięć.

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

Cześć. Udało ci się to zrobić? Dzięki. – Paul

+0

Niestety nie. –

+1

@Paul: zobacz http://stackoverflow.com/a/16655188/192373 –

Odpowiedz

1

Nie sądzę, że istnieje taka możliwość. Kolejność bajtów zależy od kodowania obrazu (png, jpeg). Więc jesteś zmuszony do odkodowania obrazu, aby coś z nim zrobić.

+0

Jednak dokumentacja systemu Android stwierdza, że ​​'public final void takePicture (Camera.ShutterCallback shutter, Camera.PictureCallback raw, Camera.PictureCallback jpeg)'. Tak więc w 'Camera.PictureCallback jpeg' zawsze otrzymam dane obrazu JPEG. –

+1

Ale nie ma metody obrócenia jpeg. Najlepszą rzeczą, którą możesz zrobić, to zmienić dane Exif. Nie wszystko to wspiera i nie będzie się obracało. –

2

Możesz ustawić obrót JPEG poprzez nagłówek Exif bez jego dekodowania. Jest to najbardziej skuteczna metoda, ale niektórzy widzowie mogą nadal wyświetlać obrócony obraz.

Można również użyć JPEG lossless rotation. Niestety, nie jestem świadomy darmowych implementacji Javy tego algorytmu.

Aktualizacja na SourceForge, istnieje klasa open source Java LLJTran. Port Androida znajduje się na GitHub.

+1

Czy wypróbowałeś LLJtran na Androida? 16s zajmuje się obracaniem pliku jpeg 2M testowanego na Samsung Galaxy S1. W każdym razie, aby skrócić czas procesu? – Yeung

+0

Och, szkoda. Dziękuję za udostępnienie. Rzucę okiem w wolnym czasie. –

+0

Proszę spojrzeć na [to] (http://stackoverflow.com/a/25603218/1099884), aby sprawdzić, czy zrobiłem coś złego w bibliotece. – Yeung

0

Spróbuj tego. To rozwiąże ten cel.

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

Proszę przeczytać pytanie - muszę obrócić tablicę bajtów bez dekodowania jej do bitmapy. –

+0

wyraźnie wspomniał, że rotacja musi być wykonana bez dekodowania. – therealprashant

Powiązane problemy