2013-06-01 61 views
0

无论如何无需创建新位图就可以调整位图的大小/缩放比例吗?假设我下载的图片高度或宽度大于2048px。在我能够显示它之前,我必须调整它,因为ImageView不支持大于2048px的位图。如果我使用Bitmap.createScaledBitmap(位图src,int dstWidth,int dstHeight,布尔过滤器)它给了我一个新的位图。现在我们有两个位图,原始和缩放。那是当我的应用程序内存不足时。无需创建新位图即可调整位图的大小

下面是我现在使用的代码。

// Async task to download the image 
private ImageView mImage; 
private ProgressBar progress; 
private Button button; 

     @Override 
     protected void onPostExecute(Bitmap result){ 
      progress.setVisibility(View.GONE); 
      if(result != null){ 

       if(result.getHeight() > 2048 || result.getWidth() > 2048){ 
        float scaledvalues[] = scale(result.getWidth(), result.getHeight()); 
        image = Bitmap.createScaledBitmap(result, (int)scaledvalues[0], (int)scaledvalues[1], false); 
        mImage.setBitmap(image); 
       } 
       else{ 
        image = result; 
        mImage.setBitmap(result); 
       } 
       button.setEnabled(true); 
      } 
     } 

    //I use this method to calculate new width and height 
    public float[] scale(int width, int height){ 
     float scaledheight = -1f; 
     float scaledwidth = -1f; 
     float scaledheightpros = -1f; 
     float scaledwidthpros = -1f; 
     float finalheight = -1f; 
     float finalwidth = -1f; 
     if(height > 2048){ 
      scaledheight = height - 2048f; 
      float s = scaledheight*100f; 
      scaledheightpros = s/100f; 
     } 
     if(width > 2048){ 
      scaledwidth = width - 2048f; 
      float z = scaledwidth * 100f; 
      scaledwidthpros = z/width; 
     } 
      if(scaledheightpros > scaledwidthpros){ 
       float a = height/100f; 
       float b = width/100f; 
       finalheight = height - (a * scaledheightpros); 
       finalwidth = width - (b * scaledheightpros); 
      } 
      else{ 
       float a = height/100f; 
       float b = width/100f; 
       finalheight = height - (a * scaledwidthpros); 
       finalwidth = width - (b * scaledwidthpros); 
      } 

     Log.i(TAG, "startingheight: " + height + " finalheight: " + finalheight + "%: " + scaledheightpros); 
     Log.i(TAG, "startingwidth: " + width + " finalwidth: " + finalwidth + "%: " + scaledwidthpros); 
     float array[] = {finalwidth, finalheight}; 
     return array; 
    } 

回答

1

如果您面临内存不足问题,请使用采样。

public static int calculateInSampleSize(
BitmapFactory.Options options, int reqWidth, int reqHeight) { 
// Raw height and width of image 
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; 
} 

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId, 
    int reqWidth, int reqHeight) { 

// First decode with inJustDecodeBounds=true to check dimensions 
final BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 
BitmapFactory.decodeResource(res, resId, options); 

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

// Decode bitmap with inSampleSize set 
options.inJustDecodeBounds = false; 
return BitmapFactory.decodeResource(res, resId, options); 
} 

在月底在ImageView的设置图像,使用该

mImageView.setImageBitmap(decodeSampledBitmapFromResource(getResources(),R.id.myimage,  
Screen_width, screen_height)); 

必读this