2011-08-01 55 views
0

Android有一個方法MediaStore.Images.Thumbnails.getThumbnail()它將返回任何圖像的縮略圖。但我注意到,縮略圖的大小限於MICRO_KIND和MINI_KIND。我怎樣才能得到我分配的任何大小的縮略圖?如何獲得具有相同確切大小的縮略圖?

在此先感謝!

回答

0
public static Bitmap transform(Matrix scaler, Bitmap source, int targetWidth, int targetHeight, boolean scaleUp) { 
    int deltaX = source.getWidth() - targetWidth; 
    int deltaY = source.getHeight() - targetHeight; 
    if (!scaleUp && (deltaX < 0 || deltaY < 0)) { 
     /* 
     * In this case the bitmap is smaller, at least in one dimension, 
     * than the target. Transform it by placing as much of the image as 
     * possible into the target and leaving the top/bottom or left/right 
     * (or both) black. 
     */ 
     Bitmap b2 = Bitmap.createBitmap(targetWidth, targetHeight, Bitmap.Config.ARGB_8888); 
     Canvas c = new Canvas(b2); 

     int deltaXHalf = Math.max(0, deltaX/2); 
     int deltaYHalf = Math.max(0, deltaY/2); 
     Rect src = new Rect(deltaXHalf, deltaYHalf, deltaXHalf + Math.min(targetWidth, source.getWidth()), deltaYHalf 
       + Math.min(targetHeight, source.getHeight())); 
     int dstX = (targetWidth - src.width())/2; 
     int dstY = (targetHeight - src.height())/2; 
     Rect dst = new Rect(dstX, dstY, targetWidth - dstX, targetHeight - dstY); 
     c.drawBitmap(source, src, dst, null); 
     return b2; 
    } 
    float bitmapWidthF = source.getWidth(); 
    float bitmapHeightF = source.getHeight(); 

    float bitmapAspect = bitmapWidthF/bitmapHeightF; 
    float viewAspect = (float) targetWidth/targetHeight; 

    if (bitmapAspect > viewAspect) { 
     float scale = targetHeight/bitmapHeightF; 
     if (scale < .9F || scale > 1F) { 
      scaler.setScale(scale, scale); 
     } else { 
      scaler = null; 
     } 
    } else { 
     float scale = targetWidth/bitmapWidthF; 
     if (scale < .9F || scale > 1F) { 
      scaler.setScale(scale, scale); 
     } else { 
      scaler = null; 
     } 
    } 

    Bitmap b1; 
    if (scaler != null) { 
     // this is used for minithumb and crop, so we want to filter here. 
     b1 = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), scaler, true); 
    } else { 
     b1 = source; 
    } 

    int dx1 = Math.max(0, b1.getWidth() - targetWidth); 
    int dy1 = Math.max(0, b1.getHeight() - targetHeight); 

    Bitmap b2 = Bitmap.createBitmap(b1, dx1/2, dy1/2, targetWidth, targetHeight); 

    if (b1 != source) { 
     b1.recycle(); 
    } 

    return b2; 
} 
相關問題