android:给图片打水印

现在是维护知识产权的时代,很多时候app展示的图片会要求打上水印以强调自己对图片的知识产权。现在道长给大家分享一下给图片打水印的方法。额,这里道长已经写成一个简单的工具类。先把工具类的代码贴上:

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;

/**
 * Created by yushan on 2017-5-18.
 */

public class WatermarkHelper {

    private int imagePositionX = 0;
    private int imagePositionY = 0;
    private Bitmap src;
    private Bitmap watermark;
    private static Context mContext;
    private static WatermarkHelper watermarkHelper;

    public static final int WATERMARK_WITH_IMAGE = 120;
    public static final int WATERMARK_WITH_WRITE = 121;
    public static final int WATERMARK_WITH_IMAGE_AND_WRITE = 122;
    private String msg = "";
    private int mTextSize = 16;
    private int mTextColor = Color.BLACK;
    private int textPositionX = 0;
    private int textPositionY = dip2px(mContext, mTextSize);

    private WatermarkHelper() {
    }

    /**
     * 获取WatermarkHelper实例
     * @param context
     * @return
     */
    public static WatermarkHelper getIntense(Context context) {
        mContext = context;
        watermarkHelper = new WatermarkHelper();
        return watermarkHelper;
    }

    /**
     * 设置背景图片
     * @param srcImageId
     * @return
     */
    public WatermarkHelper setSourceImage(int srcImageId) {
        src = drawable2Bitmap(mContext, srcImageId);
        return watermarkHelper;
    }

    /**
     * 设置水印图片
     * @param watermarkId
     * @return
     */
    public WatermarkHelper setWaterImage(int watermarkId) {
        watermark = drawable2Bitmap(mContext, watermarkId);
        return watermarkHelper;
    }

    /**
     * 设置水印图片位置
     * @param positionX
     * @param positionY
     * @return
     */
    public WatermarkHelper setWatermarkPosition(int positionX, int positionY) {
        imagePositionX = dip2px(mContext, positionX);
        imagePositionY = dip2px(mContext, positionY);
        return watermarkHelper;
    }

    /**
     * 设置水印文字
     * @param message
     * @return
     */
    public WatermarkHelper setWatermarkText(String message){
        msg = message;
        return  watermarkHelper;
    }

    /**
     * 设置水印文字大小
     * @param textSize
     * @return
     */
    public WatermarkHelper setWatermarkTextSize(int textSize){
        mTextSize = textSize;
        return watermarkHelper;
    }

    /**
     * 设置水印文字颜色
     * @param textColor
     * @return
     */
    public WatermarkHelper setWatermarkTextColor(int textColor){
        mTextColor = textColor;
        return watermarkHelper;
    }

    /**
     * 设置文字水印位置
     * @param positionX
     * @param positionY
     * @return
     */
    public WatermarkHelper setWatermarkTextPosition(int positionX, int positionY){
        textPositionX = dip2px(mContext, positionX);
        textPositionY = dip2px(mContext, positionY);
        return watermarkHelper;
    }

    /**
     * 获取打上水印的图片
     * @param resultId
     * @return
     */
    public Drawable getMarkedImage(int resultId) {
        Drawable newDrawable = null;
        switch (resultId){
            case WATERMARK_WITH_IMAGE:
                newDrawable = drawImage2Bitmap();
                break;
            case WATERMARK_WITH_WRITE:
                newDrawable = drawText2Bitmap();
                break;
            case WATERMARK_WITH_IMAGE_AND_WRITE:
                newDrawable = drawImgAndText2Bitmap();
                break;
            default:
                break;
        }


        if (newDrawable == null) {
            return null;
        }

        return newDrawable;
    }

    /**
     * 绘制带图片水印的图片
     * @return
     */
    private Drawable drawImage2Bitmap() {

        if (src == null) {
            throw new NullPointerException();
        }

        int srcWidth = src.getWidth();
        int srcHeight = src.getHeight();

        // create the new blank bitmap
        Bitmap newBitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(newBitmap);
        // draw src into
        canvas.drawBitmap(src, dip2px(mContext, 0), dip2px(mContext, 0), null);
        // draw watermark into
        if (watermark != null) {
            canvas.drawBitmap(watermark, imagePositionX, imagePositionY, null);
        }
        // save all clip
        canvas.save(Canvas.ALL_SAVE_FLAG);
        // store
        canvas.restore();

        Drawable newDrawable = bitmap2Drawable(newBitmap);

        return newDrawable;
    }

    /**
     * 绘制带文字水印的图片
     * @return
     */
    public Drawable drawText2Bitmap() {

        if (src == null) {
            throw new NullPointerException();
        }

        // deal text position at Y
        if (mTextSize != 16 && textPositionY == dip2px(mContext, 16)){
            textPositionY = dip2px(mContext, mTextSize);
        } else if (mTextSize != 16 && textPositionY != dip2px(mContext, 16)){
            textPositionY = textPositionY + dip2px(mContext, mTextSize);
        }

        // resource bitmaps are imutable,
        // so we need to convert it to mutable one
        src = src.copy(src.getConfig().ARGB_8888, true);

        Canvas canvas = new Canvas(src);
        canvas.drawBitmap(src, 0, 0, null);
        // new antialised Paint
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        // text color
        paint.setColor(mTextColor);
        paint.setTextSize(dip2px(mContext, mTextSize));
        paint.setDither(true); //获取跟清晰的图像采样
        paint.setFilterBitmap(true);//过滤一些
        Rect bounds = new Rect();
        paint.getTextBounds(msg, 0, msg.length(), bounds);
        canvas.drawText(msg, textPositionX, textPositionY, paint);


        Drawable drawable = bitmap2Drawable(src);

        return drawable;
    }

    /**
     * 绘制带图片和文字水印的图片
     * @return
     */
    public Drawable drawImgAndText2Bitmap() {

        if (src == null) {
            throw new NullPointerException();
        }

        // deal text position at Y
        if (mTextSize != 16 && textPositionY == dip2px(mContext, 16)){
            textPositionY = dip2px(mContext, mTextSize);
        } else if (mTextSize != 16 && textPositionY != dip2px(mContext, 16)){
            textPositionY = textPositionY + dip2px(mContext, mTextSize);
        }

        // resource bitmaps are imutable,
        // so we need to convert it to mutable one
        src = src.copy(src.getConfig().ARGB_8888, true);

        Canvas canvas = new Canvas(src);
        canvas.drawBitmap(src, 0, 0, null);
        // new antialised Paint
        Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
        // text color
        paint.setColor(mTextColor);
        paint.setTextSize(dip2px(mContext, mTextSize));
        paint.setDither(true); //获取跟清晰的图像采样
        paint.setFilterBitmap(true);//过滤一些
        Rect bounds = new Rect();
        paint.getTextBounds(msg, 0, msg.length(), bounds);
        canvas.drawText(msg, textPositionX, textPositionY, paint);

        // draw watermark into
        if (watermark != null) {
            canvas.drawBitmap(watermark, imagePositionX, imagePositionY, null);
        }
        // save all clip
        canvas.save(Canvas.ALL_SAVE_FLAG);
        // store
        canvas.restore();

        Drawable drawable = bitmap2Drawable(src);

        return drawable;
    }

    /**
     * drawable转换为Bitmap
     * @param context
     * @param drawableId
     * @return
     */
    private static Bitmap drawable2Bitmap(Context context, int drawableId) {
        if (drawableId == -1) {
            return null;
        }
        BitmapDrawable bitmapDrawable = (BitmapDrawable) context.getResources().getDrawable(drawableId);
        Bitmap bitmap = bitmapDrawable.getBitmap();

        return bitmap;
    }

    /**
     * bitmap转换为drawable
     * @param bitmap
     * @return
     */
    private static Drawable bitmap2Drawable(Bitmap bitmap) {
        if (bitmap == null) {
            return null;
        }
        Drawable drawable = new BitmapDrawable(bitmap);
        return drawable;
    }

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    private static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

}

使用方式如下

  • 在图片上打印图片水印
        // 图片水印
        Drawable drawable = WatermarkHelper.getIntense(this)
                .setSourceImage(R.drawable.bg)
                .setWaterImage(R.drawable.icon)
                .setWatermarkPosition(50,50)
                .getMarkedImage(WatermarkHelper.WATERMARK_WITH_IMAGE);
        if (drawable != null) {
            image.setImageDrawable(drawable);
        }
  • 在图片上打印文字水印
        // 文字水印
        Drawable drawable_text = WatermarkHelper.getIntense(this)
                .setSourceImage(R.drawable.bg)
                .setWatermarkTextSize(50)
                .setWatermarkTextColor(Color.GRAY)
                .setWatermarkTextPosition(50,50)
                .setWatermarkText("雨幕青山")
                .getMarkedImage(WatermarkHelper.WATERMARK_WITH_WRITE);
        if (drawable_text != null){
            image.setImageDrawable(drawable_text);
        }
  • 在图片上打印图片和文字水印
        // 图片和文字水印
        Drawable drawable_img_text = WatermarkHelper.getIntense(this)
                .setSourceImage(R.drawable.bg)
                .setWatermarkTextSize(30)
                .setWatermarkTextColor(Color.GRAY)
                .setWatermarkTextPosition(80,55)
                .setWatermarkText("雨幕青山")
                .setSourceImage(R.drawable.bg)
                .setWaterImage(R.drawable.icon)
                .setWatermarkPosition(30,50)
                .getMarkedImage(WatermarkHelper.WATERMARK_WITH_IMAGE_AND_WRITE);

        if (drawable_img_text != null){
            image.setImageDrawable(drawable_img_text);
        }

最后在贴一张在图片上打印图片和文字水印的效果图:
这里写图片描述

给图片打水印的工具类编写的比较简单,勉强能够使用,小伙伴们可以自己拓展一下功能。好了,希望这篇博客能够给小伙伴们提供一些帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值