2011-07-09 30 views
4

我正在尝试创建特定高度的缩略图,但保持宽高比。我正在使用下面的代码,但是如果图像比较小,生成的图像将不会填充缩略图区域时会出现问题。 imageURI只是图像的路径。Android,Java,创建缩略图保持宽高比

  BitmapFactory.Options o = new BitmapFactory.Options(); 
      o.inJustDecodeBounds = true; 
      BitmapFactory.decodeFile(imageURI, o); 
      final int REQUIRED_SIZE=70; 

      int width_tmp=o.outWidth, height_tmp=o.outHeight; 
      int scale=4; 
      while(true){ 
       if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE) 
        break; 
       width_tmp/=2; 
       height_tmp/=2; 
       scale++; 
      } 

      BitmapFactory.Options o2 = new BitmapFactory.Options(); 
      o2.inSampleSize=scale; 
      Bitmap bitmap = BitmapFactory.decodeFile(imageURI, o2); 

回答

3

您的代码始终将位图缩放至至少具有宽度或高度的1/4。如果原始图像已经足够大,它会更小。

我假设你在ImageView中显示图像(你的缩略图区域?)如果图像没有填充ImageView,你必须配置ImageView来正确调整图像大小如果你的ImageView和要显示的图像有不同的方面比例,使图像填充ImageView的唯一方法将扭曲图像

我该怎么做:我使用BitmapFactory将图像解码为更大,但接近我想要缩略图的大小。它更好地使用两个幂作为缩放参数,所以我这样做。然后我设置ImageView的android:scaleType参数,使图像显示为我喜欢的:

public static Bitmap decodeBitmap(Uri bitmapUri, ContentResolver resolver, int width, int height) throws IOException{ 
    InputStream is = resolver.openInputStream(bitmapUri); 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true;  
    BitmapFactory.decodeStream(is,null,options); 
    is.close(); 

    int ratio = Math.min(options.outWidth/width, options.outHeight/height); 
    int sampleSize = Integer.highestOneBit((int)Math.floor(ratio)); 
    if(sampleSize == 0){ 
     sampleSize = 1; 
    }  
    Log.d(RSBLBitmapFactory.class, "Sample Size: " + sampleSize); 

    options = new BitmapFactory.Options(); 
    options.inSampleSize = sampleSize; 

    is = resolver.openInputStream(bitmapUri); 
    Bitmap b = BitmapFactory.decodeStream(is,null,options); 
    is.close(); 
    return b; 
} 

<ImageView android:scaleType="fitXY"></ImageView> 
+0

作为一个很好的答案的小附录,您还可以在Android Developers上查看[专用文章](http://developer.android.com/training/displaying-bitmaps/display-bitmap.html)内存位图处理。 – Dr1Ku

相关问题