需求是根據保存的照片的不同分辨率設置不同大小的文字水印,文字需要黑色描邊,白底色,位於照片右下角
水印描邊是非常重要的,兩種區別明顯的顏色(示例代碼中使用的就是黑色和白色)可以有效的提升在不同背景下水印的可識別度。
解決方法是獲取照片的尺寸,然後根據照片的尺寸進行文字大小的設置;並利用canvas.drawText(test,x,y,paint) 設置文字繪製的位置。
- 根據Bitmap的尺寸獲取水印字體的size
/**
* 根據Bitmap的尺寸獲取水印字體的size
* 照片的分辨率以1080*1920爲基準
* 設置縮放比最小閥值,防止某些華爲平板圖片分辨率過小造成的水印鋸齒
*
* @param bitmap
* @return
*/
public static int getBitmapTextSize(Bitmap bitmap) {
// 獲取圖片的寬和高
int textSize;
// 獲取圖片的寬和高
int width = bitmap.getWidth();
int height = bitmap.getHeight();
//以分辨率爲1920*1080爲基準,計算寬高比值
float ratioWidth;
float ratioHeight;
if (width>height) {
ratioWidth = (float) width / 1920;
ratioHeight = (float) height / 1080;
} else {
ratioWidth = (float) width / 1080;
ratioHeight = (float) height / 1920;
}
float ratioMetrics = Math.min(ratioWidth, ratioHeight);
if (ratioMetrics < minLimit) {
ratioMetrics = minLimit;
}
//計算字體大小
textSize = Math.round(38 * ratioMetrics);
return textSize;
}
- 然後根據size去繪製水印字體,並設置繪製的位置
/**
* 設置文字顏色、大小、對齊方式
* @param context
* @param bitmap
* @param text
* @param size
* @return
*/
public static Bitmap drawTextToRightBottom(Context context, Bitmap bitmap, String text, int size) {
TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(0x99FFFFFF);
paint.setTextSize(size);
paint.setTextAlign(Paint.Align.LEFT);
return drawTextToBitmap(bitmap, text, paint, size);
}
/**
* 圖片上繪製文字
* 該方法中計算的繪製位置是圖片的右下角
* @param bitmap
* @param text
* @param paint
* @param size
* @return
*/
private static Bitmap drawTextToBitmap(Bitmap bitmap, String text, TextPaint paint, int size) {
android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
//描邊TextPaint,TextSize、TextBounds、TextAlign全部和傳進來的paint一致
TextPaint paintStroke = new TextPaint(Paint.ANTI_ALIAS_FLAG);
paintStroke.setTextSize(paint.getTextSize());
paintStroke.setColor(0xDD060606);
paintStroke.getTextBounds(text, 0, text.length(), new Rect());
paintStroke.setStyle(Paint.Style.STROKE);
paintStroke.setTextAlign(paint.getTextAlign());
paint.setDither(true); // 獲取跟清晰的圖像採樣
paint.setFilterBitmap(true);// 過濾一些
if (bitmapConfig == null) {
bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
}
bitmap = bitmap.copy(bitmapConfig, true);
Canvas canvas = new Canvas(bitmap);
Rect textBounds = new Rect();
paint.getTextBounds(text, 0, text.length(), textBounds);
String[] strs = text.split(",");
String xy = strs[0] + "," + strs[1];
String direcAndTime = strs[2] + "," + strs[3];
//右邊和底邊都留一個size的距離
float xyDrawX = bitmap.getWidth() - paint.measureText(xy.trim()) - size;
float direcAndTimeDrawX = bitmap.getWidth() - paint.measureText(direcAndTime.trim()) - size;
float xyDrawY = bitmap.getHeight() - 3 * size;
float direcAndTimeDrawY = bitmap.getHeight() - 2 * size;
canvas.drawText(xy, xyDrawX, xyDrawY, paint);
canvas.drawText(direcAndTime, direcAndTimeDrawX, direcAndTimeDrawY, paint);
canvas.drawText(xy, xyDrawX, xyDrawY, paintStroke);
canvas.drawText(direcAndTime, direcAndTimeDrawX, direcAndTimeDrawY, paintStroke);
return bitmap;
}
注意
setTextAlign(Align align) 設置對齊方式,會影響文字的繪製起始位置,這個在實現文字位於右下角顯示時會有影響。
- Paint.Align.LEFT 左對齊
- Paint.Align.CENTER 中心對齊,繪製從
- Paint.Align.RIGHT 右對齊
設置這三個屬性後,在畫布上繪製文字( canvas.drawText(test,x,y,paint)
) 時要注意 x 座標 ,
因爲,LEFT 對應 0,CENTER 對應 getWidth()/2 , RIGHT 對應 getWidth() ,要把這個偏移考慮進去,
否則,繪製會出現錯亂。
更多細節請 baidu-->Paint / TextPaint 的使用
Android 自定義View學習(三)——Paint 繪製文字屬性