設置相機水印字體的大小、位置

需求是根據保存的照片的不同分辨率設置不同大小的文字水印,文字需要黑色描邊,白底色,位於照片右下角

水印描邊是非常重要的,兩種區別明顯的顏色(示例代碼中使用的就是黑色和白色)可以有效的提升在不同背景下水印的可識別度。

解決方法是獲取照片的尺寸,然後根據照片的尺寸進行文字大小的設置;並利用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 繪製文字屬性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章