2013-07-24 17 views
12

Ölçeklendirilmiş bir bitmap oluşturmak istiyorum, ancak görünüşte orantısız bir görüntü elde ediyorum. Dikdörtgen olmak istediğimde kare gibi görünüyor.Android'de createScaledBitmap ile ölçeklenmiş bir bitmap oluşturma

Kodum:

Bitmap resizedBitmap = Bitmap.createScaledBitmap(myBitmap, 960, 960, false); 

istediğim şey yapayım ki nasıl 960 bir MAX olması görüntü? Genişliğin null olarak ayarlanması derlenmez. Muhtemelen basit, ama kafamı etrafına saramam. Teşekkürler

cevap

43

: kodunda http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

şuna benzer:

Sen böyle istediğiniz resmin boyutunu geçmesi nerede bir yöntem oluşturmak için gereken inJustDecodeBounds, inSampleSize, vb. tüm sürecini yapmanız gerekmez. Sadece hangi oranın kullanılacağını ve buna göre ölçeklendirmeniz gerekir.

final int maxSize = 960; 
int outWidth; 
int outHeight; 
int inWidth = myBitmap.getWidth(); 
int inHeight = myBitmap.getHeight(); 
if(inWidth > inHeight){ 
    outWidth = maxSize; 
    outHeight = (inHeight * maxSize)/inWidth; 
} else { 
    outHeight = maxSize; 
    outWidth = (inWidth * maxSize)/inHeight; 
} 

Bitmap resizedBitmap = Bitmap.createScaledBitmap(myBitmap, outWidth, outHeight, false); 

Bu resmin sadece kullanımı ölçekli versiyonu ise, bellek kullanımını en aza indirmek için, Tobiel cevabı kullanarak daha iyi.

+0

Yorumunuzu detaylandırır mısınız? "Bu görüntü için tek kullanım ölçeklenmiş bir versiyonsa, Tobiel'in cevabını kullanarak daha iyi misiniz?" – EGHDK

+0

Yani, sadece * ölçeklenmiş kullanıyorsanız, diğer cevabı kullanın. Bu şekilde kullanıyorsan daha verimli. Zaten tam ölçekli bir sürümünü yüklüyorsanız/görüntülüyorsanız, bu yöntem iyidir, çünkü her iki durumda da belleğe ihtiyacınız olacaktır. – Geobits

+0

Gotcha. Bunu temizlediğiniz için teşekkürler. – EGHDK

14

Görüntünüz kare, çünkü width = 960 ve height = 960 ayarlıyorsunuz. Zaten bellekte özgün bit eşlem varsa

public static Bitmap lessResolution (String filePath, int width, int height) { 
    int reqHeight = height; 
    int reqWidth = width; 
    BitmapFactory.Options options = new BitmapFactory.Options();  

    // First decode with inJustDecodeBounds=true to check dimensions 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(filePath, options); 

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false;   

    return BitmapFactory.decodeFile(filePath, options); 
} 

private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 

    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 
     // Calculate ratios of height and width to requested height and width 
     final int heightRatio = Math.round((float) height/(float) reqHeight); 
     final int widthRatio = Math.round((float) width/(float) reqWidth); 

     // Choose the smallest ratio as inSampleSize value, this will guarantee 
     // a final image with both dimensions larger than or equal to the 
     // requested height and width. 
     inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio; 
    } 
    return inSampleSize; 
} 
+0

Woah! Kod için teşekkürler, ancak resmin oranını koruduğundan emin olmak için yapılacak çok şey var. Girmek için bazı sihirli parametreler olacağını umuyordum. Kod snippet'i için teşekkürler! – EGHDK

+2

Sorun, OOM'u birçok nedenden ötürü bu kodla engelleyebilirsiniz. Bu bitmap hakkında android dokümanlar: http://developer.android.com/training/displaying-bitmaps/index.html – Tobiel

+0

OOM? Ayrıca, burada cevaplar hakkında ne düşünüyorsunuz? Tavsiyen için minnettarım: http://stackoverflow.com/questions/4837715/how-to-resize-a-bitmap-in-android – EGHDK

1
bmpimg = Bitmap.createScaledBitmap(srcimg, 100, 50, true); 
İlgili konular