主要有两类方法:
一、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();
}
}