2011-12-22 16 views
17

Próbuję obrócić obraz bitmapy o 90 stopni, aby zmienić go z formatu poziomego na format pionowy. Przykład:Obrót mapy bitowej o 90 stopni w Androidzie powoduje zmiażdżenie obrazu. Potrzebujesz prawdziwego obrotu między portretem a krajobrazem

[a, b, c, d]
[e, f, g, h]
[i, j, k, l]

obrócony o 90 stopni w prawo zostaje

[b, e, a]
[j, k, b]
[a, g, C]
[l H, d]

za pomocą kodu poniżej (z przykładu line) obrazu jest obrócony o 90 stopni, ale zachowuje t ma współczynnik kształtu obrazu, więc kończy się pionowo zgniecionym obrazem. czy robię coś źle? Czy jest inna metoda, której potrzebuję użyć? Jestem również skłonny obrócić plik jpeg, którego używam do tworzenia mapy bitowej, o ile jest to łatwiejsze.

// create a matrix for the manipulation 
Matrix matrix = new Matrix(); 
// resize the bit map 
matrix.postScale(scaleWidth, scaleHeight); 
// rotate the Bitmap 
matrix.postRotate(90); 

// recreate the new Bitmap 
Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOriginal, 0, 0, widthOriginal, heightOriginal, matrix, true); 
+0

Nie jestem pewien, czy dobrze rozumiem Twoje pytanie. Czy chcesz obrócić układ ekranu po zmianie orientacji? A może chcesz zmienić layouyt ekranu, mimo że orientacja się nie zmienia? (Android automatycznie obraca elementy ekranu, gdy orientacja się zmienia!) – Ahmed

+0

Dlatego chcę zmienić same dane bitmapowe. W mojej aplikacji kamera zapisuje obraz nieprawidłowo, tak że nawet jeśli zdjęcie zostanie zrobione w orientacji "portretowej", nadal ładuje je w orientacji "krajobrazowej". Jestem w stanie wykryć prawdziwą orientację poprzez dane EXIF ​​pliku i chcę obrócić mapę bitową do właściwej orientacji. Nie chcę po prostu zmieniać sposobu wyświetlania bitmapy, ale zmieniać rzeczywiste dane, aby po zmodyfikowaniu obrazu mogła być poprawnie zapisana. – user999764

Odpowiedz

13

Oto jak można go obrócić odpowiednio (Zapewnia to prawidłowe obracanie obrazu)

public static Bitmap rotate(Bitmap b, int degrees) { 
    if (degrees != 0 && b != null) { 
     Matrix m = new Matrix(); 

     m.setRotate(degrees, (float) b.getWidth()/2, (float) b.getHeight()/2); 
     try { 
      Bitmap b2 = Bitmap.createBitmap(
        b, 0, 0, b.getWidth(), b.getHeight(), m, true); 
      if (b != b2) { 
       b.recycle(); 
       b = b2; 
      } 
     } catch (OutOfMemoryError ex) { 
      throw ex; 
     } 
    } 
    return b; 
} 
+0

dziękuję, Tolga, spróbuję tego dziś wieczorem. – user999764

+0

nie ma problemu, kiedy się nad tym zastanawiałem, zrobiłem to tak, jak go miałeś (prawdopodobnie użyłem tego samego przykładu), w końcu wymyśliłem kod, który napisałem dla prawidłowego obrotu –

+0

hmmm, obraca się, ale nadal jest zgnieciony pionowo. Takie same jak wczesniej. – user999764

41

To jest wszystko, czego potrzeba, aby obrócić obraz:

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

W kodzie próbka, dołączyłeś połączenie do postScale. Czy to może być powód, dla którego twój obraz jest rozciągnięty? Może zdejmij to i przeprowadź jeszcze kilka testów.

+0

Jeśli chcesz obrócić obraz o wysokości większej niż oryginał (tak jak musi być), zobaczysz wyjątek 'java.lang.IllegalArgumentException: y + height musi być <= bitmap.height()'. Dlatego nie rób bitmapy większej niż oryginał. – CoolMind

0

Ten kod pracował wielki dla mnie:

   Matrix matrix = new Matrix(); 

      matrix.setRotate(90, 0, 0); 
      matrix.postTranslate(original.getHeight(), 0); 

      rotatedBitmap = Bitmap.createBitmap(newWidth, newHeight, original.getConfig()); 
      Canvas tmpCanvas = new Canvas(rotatedBitmap); 
      tmpCanvas.drawBitmap(original, matrix, null); 
      tmpCanvas.setBitmap(null); 
0

sprawdzić rozmiar płótna gdzie można narysować mapę bitową, może twój płótno jest wciąż krajobraz, więc tylko kwadrat część obróconej bitmapy było widać.

Powiązane problemy