现在是维护知识产权的时代,很多时候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);
}
最后在贴一张在图片上打印图片和文字水印的效果图:
给图片打水印的工具类编写的比较简单,勉强能够使用,小伙伴们可以自己拓展一下功能。好了,希望这篇博客能够给小伙伴们提供一些帮助。