Android 解決小米手機新增圖片水印後顯示黑邊的問題
背景
-
由於選擇圖片後需要需要在圖片上新增logo,經緯度座標,天氣、時間等內容(圖片水印)
-
測試反饋在小米手機上選擇圖片上傳後有圖片在右邊和下邊有一條黑邊 具體檢視下圖
-
呼叫程式碼如下使用O、V、H、及榮耀手機驗證,並沒有這個現象,應該是小米魔改系統鍋了。
/**
* 繪製水印圖片
*
* @param src 原圖
* @param watermark 水印圖片
* @param paddingLeft 水印圖片 向左距離
* @param paddingTop 水印圖片 向上距離
* @return 新增水印後的圖片
*/
private static Bitmap createWaterMaskBitmap(Bitmap src,
Bitmap watermark,
int paddingLeft,
int paddingTop) {
if (src == null) {
return null;
}
//點陣圖的寬度
int width = src.getWidth();
//點陣圖的高度
int height = src.getHeight();
//建立一個新的和SRC長度寬度一樣的點陣圖
Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
//將該圖片作為畫布
Canvas canvas = new Canvas(newBitmap);
//在畫布 0,0座標上開始繪製原始圖片
canvas.drawBitmap(src, 0, 0, null);
//在畫布上繪製水印圖片
canvas.drawBitmap(watermark, paddingLeft, paddingTop, null);
// 儲存
canvas.save();
// 儲存
canvas.restore();
return newBitmap;
}
-
雖然是小米的鍋,但是問題還是要解決的,不然就是多個bug少塊錢了😭,這個黑邊的寬度看著有點像StatusBarHeight,
-
那就把圖片中的黑邊給減掉,然後用Bitmap的寬度減去statusBar高度,上傳儲存之後和原圖做比較,發現寬高都被多裁切了尺寸
LogUtils.iTag("狀態列和,導航欄高度->",BarUtils.getStatusBarHeight(),","+BarUtils.getNavBarHeight()); if (RomUtils.isXiaomi()) { //LogUtils.iTag("狀態列和,導航欄高度->",BarUtils.getStatusBarHeight(),","+BarUtils.getNavBarHeight()); width = width - BarUtils.getStatusBarHeight(); height = height - BarUtils.getStatusBarHeight(); }
不盡如意解決方案 ,總歸是解決了,不是遺留bug😁
遺憾的是沒有找到獲取這個黑邊寬度和高度的方法
/**
* 繪製水印圖片
*
* @param src 原圖
* @param watermark 水印圖片
* @param paddingLeft 水印圖片 向左距離
* @param paddingTop 水印圖片 向上距離
* @return 新增水印後的圖片
*/
private static Bitmap createWaterMaskBitmap(Bitmap src,
Bitmap watermark,
int paddingLeft,
int paddingTop) {
if (src == null) {
return null;
}
int width = src.getWidth();
int height = src.getHeight();
//解決小米手機繪製有黑邊的問題
if (RomUtils.isXiaomi()) {
//LogUtils.iTag("狀態列和,導航欄高度->",BarUtils.getStatusBarHeight(),","+BarUtils.getNavBarHeight());
width = width - 25;
height = height - 30;
}
//建立一個新的和SRC長度寬度一樣的點陣圖
Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
//將該圖片作為畫布
Canvas canvas = new Canvas(newBitmap);
//在畫布 0,0座標上開始繪製原始圖片
canvas.drawBitmap(src, 0, 0, null);
//在畫布上繪製水印圖片
canvas.drawBitmap(watermark, paddingLeft, paddingTop, null);
// 儲存
canvas.save();
// 儲存
canvas.restore();
return newBitmap;
}
修復後的圖片
\