public
Bitmap myScaleBitmap(String path){
BitmapFactory.Options options =
new
BitmapFactory.Options();
options.inJustDecodeBounds =
true
;
BitmapFactory.decodeFile(path, options);
if
(options.mCancel || options.outWidth == -
1
|| options.outHeight == -
1
) {
return
null
;
}
options.inSampleSize = computeSampleSize(options,
600
, (
int
) (
1
*
1024
*
1024
));
options.inJustDecodeBounds =
false
;
options.inDither =
false
;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(path, options);
return
bitmap;
}
public
static
int
computeSampleSize(BitmapFactory.Options options,
int
minSideLength,
int
maxNumOfPixels) {
int
initialSize = computeInitialSampleSize(options, minSideLength,
maxNumOfPixels);
int
roundedSize;
if
(initialSize <=
8
) {
roundedSize =
1
;
while
(roundedSize < initialSize) {
roundedSize <<=
1
;
}
}
else
{
roundedSize = (initialSize +
7
) /
8
*
8
;
}
return
roundedSize;
}
private
static
int
computeInitialSampleSize(BitmapFactory.Options options,
int
minSideLength,
int
maxNumOfPixels) {
double
w = options.outWidth;
double
h = options.outHeight;
int
lowerBound = (maxNumOfPixels == -
1
) ?
1
:
(
int
) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int
upperBound = (minSideLength == -
1
) ?
128
:
(
int
) Math.min(Math.floor(w / minSideLength),
Math.floor(h / minSideLength));
if
(upperBound < lowerBound) {
return
lowerBound;
}
if
((maxNumOfPixels == -
1
) &&
(minSideLength == -
1
)) {
return
1
;
}
else
if
(minSideLength == -
1
) {
return
lowerBound;
}
else
{
return
upperBound;
}
}