[英]How to resize GIF images in Android?
I have 3 images on SD card (1 jpg and 2 gif).I want to reduce them to save memory. 我在SD卡上有3张图像(1 jpg和2 gif)。我想减少它们以节省内存。 After resizing JPG resize successfully, but GIF images have original size. 调整JPG大小后,可以成功调整大小,但是GIF图像具有原始大小。 See code and log: 查看代码和日志:
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);
}
}
}
Log: 日志:
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
What wrong ? 怎么了 Thank's a lot in advance. 非常感谢。
Try this code for re-sizing it: 尝试使用以下代码来调整大小:
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;
}
I am afraid it is an android bug: 恐怕这是一个Android错误:
https://code.google.com/p/android/issues/detail?id=3072 https://code.google.com/p/android/issues/detail?id=3072
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.