2011-12-22 14 views
17

arasında gerçek bir döndürme gerekiyor Bir bitmap görüntüyü yatay biçimden bir portre biçimine değiştirmek için 90 derece döndürmeye çalışıyorum. Örnek:Android, bitmap'i 90 derece döndürerek, ezilmiş görüntü elde edilmesini sağlar. Dikey ve yatay

[a, b, c, d]
saat yönünde 90 derece

olur [e, f, g, h]
[i, j, k, l]

döndürülebilir [ı, e, a]
[j, f, b]
[k, g-c] (çevrimiçi bir örnekten) aşağıdaki kodu kullanarak
[i, h, d]

görüntü 90 derece döndürülür ancak t o manzara en boy oranı, böylece dikey olarak ezilmiş bir görüntü ile sonuçlanır. Yanlış bir şey mi yapıyorum? Kullanmam gereken başka bir yöntem var mı? Ben de daha kolay ise bitmap oluşturmak için kullandığım jpeg dosyasını döndürmek için istekliyim. Kodunuzda

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

: Burada

// 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

Sorunuzu doğru anladığımdan emin değilim. Yönlendirme değiştiğinde ekran düzenini döndürmek ister misiniz? Veya yönelim değişmese de ekran düzenini değiştirmek mi istiyorsunuz? (Oryantasyon değiştiğinde Android ekran öğelerini otomatik olarak döndürür!) – Ahmed

+0

Bu yüzden bitmap verisinin kendisini değiştirmek istiyorum. Uygulamamda kamera resmi yanlış şekilde saklıyor, böylece "portre" yönünde bir resim çekilse bile görüntüyü hala "manzara" yönünde yüklüyor. Dosyanın EXIF ​​verileri aracılığıyla gerçek yönlendirmeyi algılayabiliyorum ve bitmap'i doğru yönlendirmeye döndürmek istiyorum. Sadece bitmap'in nasıl görüntülendiğini değiştirmek istemiyorum ama gerçek verileri değiştirdim, böylece görüntüyü değiştirdikten sonra doğru şekilde kaydedilebilir. – user999764

cevap

13

düzgün döndürmek girerdim

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

Teşekkürler Tolga, bu akşam bunu deneyeceğim. – user999764

+0

hiçbir sorun, ben içine baktığımda, ben (muhtemelen aynı örnek kullanılan) ben bunu doğru rotasyon –

+0

hmmm için yayınlanan kod ile geldi, ben döndüm ama yine de dikey olarak ezilmiş aldım. Öncekinin aynısı. – user999764

41

Bu görüntüyü döndürmek için gereken tek şey (bu resmin doğru dönüşünü sigortalanır) Örnek, postScale'e bir çağrı dahil ettiniz. Görüntünün uzatılmasının nedeni bu olabilir mi? Belki de bunu çıkarın ve daha fazla test yapın.

+0

Orijinalden daha yüksek bir dönüşlü görüntü yapmak istiyorsanız (olması gerektiği gibi), bir özel durum görürsünüz java.lang.IllegalArgumentException: y + height <= bitmap.height() 'olmalıdır. Yani, orijinalden daha büyük bitmap yapmayın. – CoolMind

0

Bu kod benim için çok çalıştı:

   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

çek belki tuvalinizi hala manzara olduğunu bitmap çizmek tuval boyutu, döndürülmüş bitmap'in böylece sadece kare kısmı görülebilir.

İlgili konular