2013-03-13 44 views
1

我在SD卡上有3张图片(1 jpg和2 gif)。我想减少它们以节省内存。调整JPG大小调整大小后,但GIF图像具有原始大小。见代码和日志:如何在Android中调整GIF图像大小?

public class BitmapHelper 
{ 
    private static int calculateInSampleSize(BitmapFactory.Options options, int imgHeigth, int imgWidth) 
    { 
     int inSampleSize = 1; 

    if(imgHeigth > 80 || imgWidth > 120) 
    { 
     final int heightRatio = Math.round((float) imgHeigth/80); 
     final int widthRatio = Math.round((float) imgWidth/120); 

     if(heightRatio < widthRatio) 
      return heightRatio; 
     if(heightRatio > widthRatio) 
      return widthRatio; 
     if(heightRatio == widthRatio) 
      return heightRatio; 

    } 

    return inSampleSize; 
} 

public Bitmap decodeBitmapFromFile(String imageUrl, Resources res) 
{ 
    BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(imageUrl, options); 
    if(options.outMimeType != null) 
    { 
     options.inSampleSize = calculateInSampleSize(options, options.outHeight, options.outWidth); 
     options.inJustDecodeBounds = false; 
     Bitmap bmp = BitmapFactory.decodeFile(imageUrl, options); 
     Log.d("Debugger", "Height: " + options.outHeight + "; Width: " + options.outWidth); 
     return bmp; 

    } 
    else 
    { 
     options.inSampleSize = 2; 
     options.inJustDecodeBounds = false; 
     return BitmapFactory.decodeResource(res, R.drawable.play, options); 
    }   
} 
} 

登录:

Height: 97; Width: 175 
Height: 324; Width: 550 
Height: 97; Width: 175 
Height: 226; Width: 400 
Height: 97; Width: 175 
Height: 324; Width: 550 
Height: 226; Width: 400 

97x175 - JPEG - (Original size: 388x698) 
324x550 - GIF - original size 
226x400 - GIF - original size 

错了呢?提前感谢很多。

+0

你有没有得到这个整理出来?我遇到同样的问题,无法调整GIF的大小。 – mraviator 2013-03-26 18:49:04

回答

0

尝试为重新调整其大小此代码:

Display display = getWindow().getWindowManager().getDefaultDisplay();      
       int hsize= (int) ((int)display.getHeight()-(display.getHeight()*(0.50))); 
       int wsize= (int) ((int)display.getWidth()-(display.getWidth()*0.25)); 

      Bitmap originalImage=decodeSampledBitmapFromResource(getResources(),imageId,wsize,hsize);    
      ImageView imageView = new ImageView(mContext); 
      imageView.setImageBitmap(scaleBitmap(originalImage)); 
      imageView.setLayoutParams(new CoverFlow.LayoutParams(wsize,hsize)); 
      imageView.setScaleType(ScaleType.MATRIX); 

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); 
} 
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) 
    { 
     if (width > height) 
     { 
      inSampleSize = Math.round((float)height/(float)reqHeight); 
     } else { 
      inSampleSize = Math.round((float)width/(float)reqWidth); 
     } 
    } 
    return inSampleSize; 
} 

private Bitmap scaleBitmap(Bitmap bitmap) 
    { 

      int iWidth=bitmap.getWidth() ; 
      int iHeight=bitmap.getHeight(); 
      int newWidth=0,newHeight=0; 

      float fFactor=(float)iHeight/(float)iWidth; 

      if(iWidth<=iHeight) 
      { 
        newWidth = 300;          
        newHeight =(int) (newWidth * fFactor) ;//370; 
      } 
      else 
      { 
        newWidth = 400;        
        newHeight =(int) (newWidth * fFactor) ;//370; 
      } 
       float fScaleWidth = ((float) newWidth)/iWidth; 
       float fScaleHeight = ((float) newHeight)/iHeight; 

       Matrix matrix = new Matrix(); 
       // resize the bit map 
       matrix.postScale(fScaleWidth, fScaleHeight); 

      Bitmap resizedBitmappreview = Bitmap.createBitmap(bitmap, 0, 0,iWidth, iHeight, matrix, true); 

      return resizedBitmappreview; 
    }