主要有两类方法:
一、decodeBitmap:对Bitmap不压缩,但是会根据屏幕的密度合适的进行缩放压缩
二、compressBimtap:对Bitmap进行超过最大宽高的压缩,同时也会根据屏幕的密度合适的进行缩放压缩。
public
class
BitmapDecodeUtil {
private
static
final
int
DEFAULT_DENSITY = 240;
private
static
final
float
SCALE_FACTOR = 0.75f;
private
static
final
Bitmap.Config DEFAULT_BITMAP_CONFIG = Bitmap.Config.RGB_565;
private
static
BitmapFactory.Options getBitmapOptions(Context context) {
BitmapFactory.Options
options = new
BitmapFactory.Options();
options.inScaled
= true;
options.inPreferredConfig
= DEFAULT_BITMAP_CONFIG;
options.inPurgeable
= true;
options.inInputShareable
= true;
options.inJustDecodeBounds
= false;
if
(Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
Field
field = null;
try
{
field
= BitmapFactory.Options.class.getDeclaredField("inNativeAlloc");
field.setAccessible(true);
field.setBoolean(options, true);
} catch
(NoSuchFieldException e) {
e.printStackTrace();
} catch
(IllegalAccessException e) {
e.printStackTrace();
}
}
int
displayDensityDpi = context.getResources().getDisplayMetrics().densityDpi;
float
displayDensity = context.getResources().getDisplayMetrics().density;
if
(displayDensityDpi > DEFAULT_DENSITY && displayDensity > 1.5f)
{
int
density = (int)
(displayDensityDpi * SCALE_FACTOR);
options.inDensity
= density;
options.inTargetDensity
= density;
}
return
options;
}
public
static
Bitmap decodeBitmap(Context context, int
resId) {
checkParam(context);
return
BitmapFactory.decodeResource(context.getResources(), resId, getBitmapOptions(context));
}
public
static
Bitmap decodeBitmap(Context context, String pathName) {
checkParam(context);
return
BitmapFactory.decodeFile(pathName, getBitmapOptions(context));
}
public
static
Bitmap decodeBitmap(Context context, InputStream is) {
checkParam(context);
checkParam(is);
return
BitmapFactory.decodeStream(is, null,
getBitmapOptions(context));
}
public
static
Bitmap compressBitmap(Context context,int
resId, int
maxWidth, int
maxHeight) {
checkParam(context);
final
TypedValue value = new
TypedValue();
InputStream
is = null;
try
{
is
= context.getResources().openRawResource(resId, value);
return
compressBitmap(context, is, maxWidth, maxHeight);
} catch
(Exception e) {
e.printStackTrace();
} finally
{
if
(is != null)
{
try
{
is.close();
} catch
(IOException e) {
e.printStackTrace();
}
}
}
return
null;
}
public
static
Bitmap compressBitmap(Context context, String pathName, int
maxWidth, int
maxHeight) {
checkParam(context);
InputStream
is = null;
try
{
is
= new
FileInputStream(pathName);
return
compressBitmap(context, is, maxWidth, maxHeight);
} catch
(FileNotFoundException e) {
e.printStackTrace();
} finally
{
if
(is != null)
{
try
{
is.close();
} catch
(IOException e) {
e.printStackTrace();
}
}
}
return
null;
}
public
static
Bitmap compressBitmap(Context context, InputStream is, int
maxWidth, int
maxHeight) {
checkParam(context);
checkParam(is);
BitmapFactory.Options
opt = new
BitmapFactory.Options();
opt.inJustDecodeBounds
= true;
BitmapFactory.decodeStream(is, null,
opt);
int
height = opt.outHeight;
int
width = opt.outWidth;
int
sampleSize = computeSampleSize(width, height, maxWidth, maxHeight);
BitmapFactory.Options
options = getBitmapOptions(context);
options.inSampleSize
= sampleSize;
return
BitmapFactory.decodeStream(is, null,
options);
}
private
static
int
computeSampleSize(int
width, int
height, int
maxWidth, int
maxHeight) {
int
inSampleSize = 1;
if
(height &gt; maxHeight || width > maxWidth) {
final
int
heightRate = Math.round((float)
height / (float)
maxHeight);
final
int
widthRate = Math.round((float)
width / (float)
maxWidth);
inSampleSize
= heightRate < widthRate ? heightRate : widthRate;
}
if
(inSampleSize % 2
!= 0)
{
inSampleSize
-= 1;
}
return
inSampleSize &lt;= 1
? 1
: inSampleSize;
}
private
static
&lt;T&gt; void
checkParam(T param){
if(param
== null)
throw
new
NullPointerException();
}
}