// 先按5:4生成一張白色背景圖片
int width;
int height;
// 先按5:4生成一張白色背景圖片
boolean isWidthLong = bitmap.getWidth() > bitmap.getHeight();
if (isWidthLong) {
width = bitmap.getWidth();
height = width * 4 / 5;// 微信顯示小程序的圖片是5:4
} else {
height = bitmap.getHeight();
width = height * 5 / 4;
}
width = width * 5 / 4;// 這個倍數多次測試之後顯示效果最佳
height = height * 5 / 4;
Bitmap mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 再將顯示的圖和背景圖合成一張圖片
if (isWidthLong) {
mCanvas.drawBitmap(bitmap, 0, (height - height_head) / 4, mPicturePaint);
} else {
mCanvas.drawBitmap(bitmap, (width - width_head) / 4, 0, mPicturePaint);
}
下面是完整代碼
public static Bitmap drawWXMiniBitmap(Bitmap bitmap) {
int width;
int height;
// 先按5:4生成一張白色背景圖片
boolean isWidthLong = bitmap.getWidth() > bitmap.getHeight();
if (isWidthLong) {
width = bitmap.getWidth();
height = width * 4 / 5;// 微信顯示小程序的圖片是5:4
} else {
height = bitmap.getHeight();
width = height * 5 / 4;
}
width = width * 5 / 4;// 這個倍數多次測試之後顯示效果最佳
height = height * 5 / 4;
Bitmap mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 用這個Bitmap生成一個Canvas,然後canvas就會把內容繪製到上面這個bitmap中
Canvas mCanvas = new Canvas(mBitmap);
mCanvas.drawColor(Color.WHITE);
// 繪製畫筆
Paint mPicturePaint = new Paint();
// 繪製背景圖片
mCanvas.drawBitmap(mBitmap, 0.0f, 0.0f, mPicturePaint);
// 繪製圖片的寬、高
int width_head = bitmap.getWidth();
int height_head = bitmap.getHeight();
// 繪製圖片--保證其在水平方向居中
if (isWidthLong) {
mCanvas.drawBitmap(bitmap, 0, (height - height_head) / 4, mPicturePaint);
} else {
mCanvas.drawBitmap(bitmap, (width - width_head) / 4, 0, mPicturePaint);
}
// mCanvas.drawBitmap(bitmap, 0, 0, mPicturePaint);
// 保存繪圖爲本地圖片
mCanvas.save();
mCanvas.restore();
while (isOverSize(mBitmap, MAX_WX_IMAGE)) {
mBitmap = imageZoom(mBitmap);
}
return mBitmap;
}
附上兩個工具函數
public static boolean isOverSize(Bitmap bitmap, int maxSize) {
// 將bitmap放至數組中,意在bitmap的大小(與實際讀取的原文件要大)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
// 將字節換成KB
double mid = b.length / 1024;
LogUtils.d("isOverSize : " + mid);
// 判斷bitmap佔用空間是否大於允許最大空間 如果大於則壓縮 小於則不壓縮
return mid > maxSize;
}
public static Bitmap imageZoom(Bitmap src_bitmap) {
// 圖片允許最大空間 單位:KB
double maxSize = MAX_WX_IMAGE;//32
// 將bitmap放至數組中,意在bitmap的大小(與實際讀取的原文件要大)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
src_bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
// 將字節換成KB
double mid = b.length / 1024;
// 判斷bitmap佔用空間是否大於允許最大空間 如果大於則壓縮 小於則不壓縮
if (mid > maxSize) {
// 獲取bitmap大小 是允許最大大小的多少倍
double i = mid / maxSize;
LogUtils.d("i : " + i);
// 開始壓縮 此處用到平方根 將寬帶和高度壓縮掉對應的平方根倍 (1.保持刻度和高度和原bitmap比率一致,壓縮後也達到了最大大小佔用空間的大小)
Bitmap bitmap = zoomImage(src_bitmap, src_bitmap.getWidth() / Math.sqrt(i),
src_bitmap.getHeight() / Math.sqrt(i));
return bitmap;
}
return src_bitmap;
}