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

调用方式:

ObjectsrcPath; // 源图片,可以是sdcard文件路径,也可以是图片库的Uri
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);


更多相关文章

  1. 【Android】android图片轮播
  2. android获取指定路径下目录文件
  3. Android:EditText插入图片实现图文混排
  4. Android之GLES2.0显示图片测试代码
  5. Android 自定义ProgressBar--进度自己设置图片
  6. android之PopUpWindow显示Listview(文件列表)
  7. Android 本地图片多选
  8. Android圆角图片封装类
  9. Android 不能生成R文件,gen目录为空

随机推荐

  1. Cocos2dx杂记:仿Android提示Toast
  2. 14天学会安卓开发(第十天)Android网络与
  3. 在eclipse创建android 工程
  4. Android开发学习
  5. 今天的小收获
  6. Android核心分析(链接)
  7. Android(安卓)异步和超时处理 例子
  8. 解决Android9.0网络请求无效问题
  9. Android(安卓)打开网络上pdf文件
  10. android webview加载网页不显示图片问题