2012-03-07 16 views
9

Właśnie zakończyłem działanie kamery i cudownie zapisuję dane. Co zrobić po wykonaniu zdjęcia zrobione:Android Obróć zdjęcie przed zapisaniem

protected void savePictureData() { 
    try { 
     FileOutputStream fs = new FileOutputStream(this.photo); 
     fs.write(this.lastCamData); 
     fs.close(); //okay, wonderful! file is just written to the sdcard 

     //--------------------- 
     //--------------------- 
     //TODO in here: dont save just the file but ROTATE the image and then save it! 
     //--------------------- 
     //--------------------- 


     Intent data = new Intent(); //just a simple intent returning some data... 
     data.putExtra("picture_name", this.fname); 
     data.putExtra("byte_data", this.lastCamData); 
     this.setResult(SAVED_TOOK_PICTURE, data); 
     this.finish(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     this.IOError(); 
    } 

} 

Co chcę już jako komentarzu podany w powyższym kodzie. Nie chcę, aby obraz został zapisany do pliku, ale został obrócony, a następnie zapisany! Dzięki!

// EDIT: Jaka jestem obecnie do (działa, ale nadal działa w kwestii pamięci o duże zdjęcia)

byte[] pictureBytes; 
Bitmap thePicture = BitmapFactory.decodeByteArray(this.lastCamData, 0, this.lastCamData.length); 
Matrix m = new Matrix(); 
m.postRotate(90); 
thePicture = Bitmap.createBitmap(thePicture, 0, 0, thePicture.getWidth(), thePicture.getHeight(), m, true); 

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
thePicture.compress(CompressFormat.JPEG, 100, bos); 
pictureBytes = bos.toByteArray(); 

FileOutputStream fs = new FileOutputStream(this.photo); 
fs.write(pictureBytes); 
fs.close(); 
Intent data = new Intent(); 
data.putExtra("picture_name", this.fname); 
data.putExtra("byte_data", pictureBytes); 
this.setResult(SAVED_TOOK_PICTURE, data); 
this.finish(); 
+0

możliwe duplikat [Android: Jak obrócić bitmapę na punkcie środkowym] (http://stackoverflow.com/questions/4166917/android-how-to-rotate-a-bitmap-on-a -center-point) – slayton

+0

Nah, nie tak naprawdę, to więcej o tym, jak obracać i oszczędzać później – androidavid

+0

W porządku moje rozwiązanie wydaje się działać - czyszczenie projektu ... – androidavid

Odpowiedz

4

Przed utworzeniem FileOutputStream można utworzyć nowy Bitmap od oryginału, że został przekształcony za pomocą Matrix. Aby to zrobić należy użyć tej metody:

createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 

Jeżeli m definiuje macierz przetransponuje oryginalną mapę bitową.

Na przykład o tym, jak zrobić to spojrzenie na to pytanie: Android: How to rotate a bitmap on a center point

+0

hej, spójrz na moją edycję. próbowałem, ale to nie działa w ten sposób ...:/ – androidavid

+0

Próbuję czegoś takiego. Ale za każdym razem, gdy kopiuję bitmapę, mam wyjątek: z pamięci ... –

+0

@JoubertVasconcelos, musisz skalować obraz w dół. – slayton

17

można tylko odczytać ścieżkę z karty SD i mają następujący kod ... Zaraz go zastąpić istniejący zdjęcie po obróceniu go ..

Uwaga: Exif nie działa na większości urządzeń, daje złe dane, więc dobrze jest zakodować kodowanie przed zapisaniem w dowolnym stopniu, Po prostu trzeba zmienić wartość kąta w trybie postRotate jeśli chcesz.

String photopath = tempphoto.getPath().toString(); 
    Bitmap bmp = BitmapFactory.decodeFile(photopath); 

    Matrix matrix = new Matrix(); 
    matrix.postRotate(90); 
    bmp = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true); 

    FileOutputStream fOut; 
    try { 
     fOut = new FileOutputStream(tempphoto); 
     bmp.compress(Bitmap.CompressFormat.JPEG, 85, fOut); 
     fOut.flush(); 
     fOut.close(); 

    } catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 
+0

To zadziałało dla mnie. Dzięki. – BRS

+0

Świetny szef, pracował też dla mnie! –

+0

Problem, który mamy programistów ze zdjęciami pochodzi z klasy bitmapy! Zawsze przekazujesz obraz dla klasy bitmap, ten obraca zdjęcie do 90 stopni. Rozwiązaniem jest to, że zawsze używamy klasy bitmap i musimy pokazać zdjęcie, które musimy zastosować "matrix.postRotate (90)"; aby utworzyć obróconą mapę bitową. –

Powiązane problemy