Android图片压缩
16lz
2021-01-23
importjava.io.File;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.OutputStream;
importandroid.content.Context;
importandroid.database.Cursor;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.CompressFormat;
importandroid.graphics.BitmapFactory;
importandroid.net.Uri;
importandroid.provider.MediaStore.Images;
importandroid.util.Log;
public classImageCompress
{
public static finalStringCONTENT="content";
public static finalStringFILE="file";
/**
*图片压缩参数
*
* @author Administrator
*
*/
public static classCompressOptions
{
public static final intDEFAULT_WIDTH=400;
public static final intDEFAULT_HEIGHT=800;
public intmaxWidth=DEFAULT_WIDTH;
public intmaxHeight=DEFAULT_HEIGHT;
/**
*压缩后图片保存的文件
*/
publicFiledestFile;
/**
*图片压缩格式,默认为jpg格式
*/
publicCompressFormatimgFormat=CompressFormat.JPEG;
/**
*图片压缩比例默认为30
*/
public intquality=30;
publicUriuri;
}
publicBitmapcompressFromUri(Contextcontext,CompressOptionscompressOptions)
{
// uri指向的文件路径
StringfilePath=getFilePath(context,compressOptions.uri);
if( null==filePath)
{
return null;
}
BitmapFactory.Optionsoptions= newBitmapFactory.Options();
options.inJustDecodeBounds= true;
Bitmaptemp=BitmapFactory.decodeFile(filePath,options);
intactualWidth=options.outWidth;
intactualHeight=options.outHeight;
intdesiredWidth=getResizedDimension(compressOptions.maxWidth,compressOptions.maxHeight,actualWidth,actualHeight);
intdesiredHeight=getResizedDimension(compressOptions.maxHeight,compressOptions.maxWidth,actualHeight,actualWidth);
options.inJustDecodeBounds= false;
options.inSampleSize=findBestSampleSize(actualWidth,actualHeight,desiredWidth,desiredHeight);
Bitmapbitmap= null;
BitmapdestBitmap=BitmapFactory.decodeFile(filePath,options);
// Ifnecessary,scaledowntothemaximalacceptablesize.
if(destBitmap.getWidth()>desiredWidth||destBitmap.getHeight()>desiredHeight)
{
bitmap=Bitmap.createScaledBitmap(destBitmap,desiredWidth,desiredHeight, true);
destBitmap.recycle();
}
else
{
bitmap=destBitmap;
}
// compressfileifneed
if( null!=compressOptions.destFile)
{
compressFile(compressOptions,bitmap);
}
returnbitmap;
}
/**
*compressfilefrombitmapwithcompressOptions
*
* @param compressOptions
* @param bitmap
*/
private voidcompressFile(CompressOptionscompressOptions,Bitmapbitmap)
{
OutputStreamstream= null;
try
{
stream= newFileOutputStream(compressOptions.destFile);
}
catch(FileNotFoundExceptione)
{
Log.e("ImageCompress",e.getMessage());
}
bitmap.compress(compressOptions.imgFormat,compressOptions.quality,
stream);
}
private static intfindBestSampleSize( intactualWidth, intactualHeight, intdesiredWidth, intdesiredHeight)
{
doublewr=( double)actualWidth/desiredWidth;
doublehr=( double)actualHeight/desiredHeight;
doubleratio=Math.min(wr,hr);
floatn=1.0f;
while((n*2)<=ratio)
{
n*=2;
}
return( int)n;
}
private static intgetResizedDimension( intmaxPrimary, intmaxSecondary, intactualPrimary, intactualSecondary)
{
// Ifnodominantvalueatall,justreturntheactual.
if(maxPrimary==0&&maxSecondary==0)
{
returnactualPrimary;
}
// Ifprimaryisunspecified,scaleprimarytomatchsecondary'sscaling
// ratio.
if(maxPrimary==0)
{
doubleratio=( double)maxSecondary/( double)actualSecondary;
return( int)(actualPrimary*ratio);
}
if(maxSecondary==0)
{
returnmaxPrimary;
}
doubleratio=( double)actualSecondary/( double)actualPrimary;
intresized=maxPrimary;
if(resized*ratio>maxSecondary)
{
resized=( int)(maxSecondary/ratio);
}
returnresized;
}
/**
*获取文件的路径
*
* @param scheme
* @return
*/
privateStringgetFilePath(Contextcontext,Uriuri)
{
StringfilePath= null;
if(CONTENT.equalsIgnoreCase(uri.getScheme()))
{
Cursorcursor=context.getContentResolver().query(uri, newString[]{Images.Media.DATA}, null, null, null);
if( null==cursor)
{
return null;
}
try
{
if(cursor.moveToNext())
{
filePath=cursor.getString(cursor.getColumnIndex(Images.Media.DATA));
}
}
finally
{
cursor.close();
}
}
// 从文件中选择
if(FILE.equalsIgnoreCase(uri.getScheme()))
{
filePath=uri.getPath();
}
returnfilePath;
}
} ImageCompress.java
StringdstPath; // 压缩后的保存路径
CompressOptionsoptions= newCompressOptions();
options.destFile= newFile(dstPath);
options.maxWidth=1000;
options.maxHeight=1280;
options.uri=(srcPath instanceofUri)?((Uri)srcPath):Uri.fromFile( newFile(srcPath.toString())); BitmapbitMap= new ImageCompress().compressFromUri(context,options);
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.OutputStream;
importandroid.content.Context;
importandroid.database.Cursor;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.CompressFormat;
importandroid.graphics.BitmapFactory;
importandroid.net.Uri;
importandroid.provider.MediaStore.Images;
importandroid.util.Log;
public classImageCompress
{
public static finalStringCONTENT="content";
public static finalStringFILE="file";
/**
*图片压缩参数
*
* @author Administrator
*
*/
public static classCompressOptions
{
public static final intDEFAULT_WIDTH=400;
public static final intDEFAULT_HEIGHT=800;
public intmaxWidth=DEFAULT_WIDTH;
public intmaxHeight=DEFAULT_HEIGHT;
/**
*压缩后图片保存的文件
*/
publicFiledestFile;
/**
*图片压缩格式,默认为jpg格式
*/
publicCompressFormatimgFormat=CompressFormat.JPEG;
/**
*图片压缩比例默认为30
*/
public intquality=30;
publicUriuri;
}
publicBitmapcompressFromUri(Contextcontext,CompressOptionscompressOptions)
{
// uri指向的文件路径
StringfilePath=getFilePath(context,compressOptions.uri);
if( null==filePath)
{
return null;
}
BitmapFactory.Optionsoptions= newBitmapFactory.Options();
options.inJustDecodeBounds= true;
Bitmaptemp=BitmapFactory.decodeFile(filePath,options);
intactualWidth=options.outWidth;
intactualHeight=options.outHeight;
intdesiredWidth=getResizedDimension(compressOptions.maxWidth,compressOptions.maxHeight,actualWidth,actualHeight);
intdesiredHeight=getResizedDimension(compressOptions.maxHeight,compressOptions.maxWidth,actualHeight,actualWidth);
options.inJustDecodeBounds= false;
options.inSampleSize=findBestSampleSize(actualWidth,actualHeight,desiredWidth,desiredHeight);
Bitmapbitmap= null;
BitmapdestBitmap=BitmapFactory.decodeFile(filePath,options);
// Ifnecessary,scaledowntothemaximalacceptablesize.
if(destBitmap.getWidth()>desiredWidth||destBitmap.getHeight()>desiredHeight)
{
bitmap=Bitmap.createScaledBitmap(destBitmap,desiredWidth,desiredHeight, true);
destBitmap.recycle();
}
else
{
bitmap=destBitmap;
}
// compressfileifneed
if( null!=compressOptions.destFile)
{
compressFile(compressOptions,bitmap);
}
returnbitmap;
}
/**
*compressfilefrombitmapwithcompressOptions
*
* @param compressOptions
* @param bitmap
*/
private voidcompressFile(CompressOptionscompressOptions,Bitmapbitmap)
{
OutputStreamstream= null;
try
{
stream= newFileOutputStream(compressOptions.destFile);
}
catch(FileNotFoundExceptione)
{
Log.e("ImageCompress",e.getMessage());
}
bitmap.compress(compressOptions.imgFormat,compressOptions.quality,
stream);
}
private static intfindBestSampleSize( intactualWidth, intactualHeight, intdesiredWidth, intdesiredHeight)
{
doublewr=( double)actualWidth/desiredWidth;
doublehr=( double)actualHeight/desiredHeight;
doubleratio=Math.min(wr,hr);
floatn=1.0f;
while((n*2)<=ratio)
{
n*=2;
}
return( int)n;
}
private static intgetResizedDimension( intmaxPrimary, intmaxSecondary, intactualPrimary, intactualSecondary)
{
// Ifnodominantvalueatall,justreturntheactual.
if(maxPrimary==0&&maxSecondary==0)
{
returnactualPrimary;
}
// Ifprimaryisunspecified,scaleprimarytomatchsecondary'sscaling
// ratio.
if(maxPrimary==0)
{
doubleratio=( double)maxSecondary/( double)actualSecondary;
return( int)(actualPrimary*ratio);
}
if(maxSecondary==0)
{
returnmaxPrimary;
}
doubleratio=( double)actualSecondary/( double)actualPrimary;
intresized=maxPrimary;
if(resized*ratio>maxSecondary)
{
resized=( int)(maxSecondary/ratio);
}
returnresized;
}
/**
*获取文件的路径
*
* @param scheme
* @return
*/
privateStringgetFilePath(Contextcontext,Uriuri)
{
StringfilePath= null;
if(CONTENT.equalsIgnoreCase(uri.getScheme()))
{
Cursorcursor=context.getContentResolver().query(uri, newString[]{Images.Media.DATA}, null, null, null);
if( null==cursor)
{
return null;
}
try
{
if(cursor.moveToNext())
{
filePath=cursor.getString(cursor.getColumnIndex(Images.Media.DATA));
}
}
finally
{
cursor.close();
}
}
// 从文件中选择
if(FILE.equalsIgnoreCase(uri.getScheme()))
{
filePath=uri.getPath();
}
returnfilePath;
}
} ImageCompress.java
调用方式:
ObjectsrcPath; // 源图片,可以是sdcard文件路径,也可以是图片库的UriStringdstPath; // 压缩后的保存路径
CompressOptionsoptions= newCompressOptions();
options.destFile= newFile(dstPath);
options.maxWidth=1000;
options.maxHeight=1280;
options.uri=(srcPath instanceofUri)?((Uri)srcPath):Uri.fromFile( newFile(srcPath.toString())); BitmapbitMap= new ImageCompress().compressFromUri(context,options);
更多相关文章
- 【Android】android图片轮播
- android获取指定路径下目录文件
- Android:EditText插入图片实现图文混排
- Android之GLES2.0显示图片测试代码
- Android 自定义ProgressBar--进度自己设置图片
- android之PopUpWindow显示Listview(文件列表)
- Android 本地图片多选
- Android圆角图片封装类
- Android 不能生成R文件,gen目录为空