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