Android 为图片添加文字水印

先上图:

上代码

------------------------MainActivity------------------------

package com.example.zhuoshi.watermarkdemo;

import android.graphics.Bitmap;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
/**
 * Author: baipenggui
 * Date: 2019/1/23 16:06
 * Email: [email protected]
 * Description: 在Activity中进行图片展示,以及图片保存
 */
public class MainActivity extends AppCompatActivity {
    private static String filePath = Environment.getExternalStorageDirectory() + "/WatermarkPicture/";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String photoAddress = "海淀区-清河路-西三旗桥";
        String phoneDate = "2019-01-22";
        String illicitCode = "1008";
        String illicitBehavior = "闯红灯";
        String equipmentNumber = "fgf54327d";
        String antifakeInformation = "*#4%6&*@";
        ImageView imageView = findViewById(R.id.image);
        int resource = R.drawable.girl;
        WatermarkSettings.getmInstance(this);
        Bitmap bitmap = WatermarkSettings.createWatermark(resource, photoAddress, phoneDate, illicitCode, illicitBehavior, equipmentNumber, antifakeInformation);
        imageView.setImageBitmap(bitmap);
        //保存图片
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                WatermarkSettings.savaWaterparkFile(filePath);
                Toast.makeText(MainActivity.this, "您点击了图片,已保存", Toast.LENGTH_SHORT).show();
            }
        });

    }
}

------------------------WatermarkSettings------------------------

package com.example.zhuoshi.watermarkdemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Rect;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.WindowManager;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
 * Author: baipenggui
 * Date: 2019/1/23 16:06
 * Email: [email protected]
 * Description: 形成水印工具类
 */
public class WatermarkSettings {


    public static WatermarkSettings mInstance;
    public static Context mContext;
    public static int mResources;
    private static String watermarkText;
    private static String mPhotoGraphed;
    private static String mPhotoDate;
    private static String mIllicitCode;
    private static String mIllicitBehavior;
    private static String mEquipmentNumber;
    private static String mAntifakeInformation;
    private static String TAG = "";
   /*
    *@Description: 图片添加水印的信息
    *@Params:
    *@Author: baipenggui
    *@Date: 2019/1/23
    */
    public static WatermarkSettings getmInstance(Context context) {
        mContext = context;
        if (mInstance == null) {
            mInstance = new WatermarkSettings();
        }
        TAG = mContext.getClass().getName();
        return mInstance;
    }

    /**
     * @Description 创建水印文件,以下是水印上添加的文本信息
     * @param resources 需要添加水印的图片资源
     * @param photoGraphed 拍照地点
     * @param photoDate 拍照时间
     * @param illicitCode 违法代码
     * @param illicitBehavior 违法行为
     * @param equipmentNumber 设备编号
     * @param antifakeInformation 防伪信息
     * @return
     */
    public static Bitmap createWatermark(int resources, String photoGraphed, String photoDate,
                                         String illicitCode, String illicitBehavior, String equipmentNumber, String antifakeInformation) {
        mResources = resources;
        mPhotoGraphed = photoGraphed;
        mPhotoDate = photoDate;
        mIllicitCode = illicitCode;
        mIllicitBehavior =  illicitBehavior;
        mEquipmentNumber = equipmentNumber;
        mAntifakeInformation = antifakeInformation;
        Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), resources);
        // 获取图片的宽高
        int bitmapWidth = bitmap.getWidth();
        int bitmapHeight = bitmap.getHeight();
        // 创建一个和图片一样大的背景图
        Bitmap bmp = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bmp);
        // 画背景图
        canvas.drawBitmap(bitmap, 0, 0, null);
        watermarkText = "违法时间:" + photoDate + "\n违法地点:" + photoGraphed + "\n违法代码:" + illicitCode + "\n违法行为:" + illicitBehavior + "\n设备编号:" + equipmentNumber + "\n防伪信息:" + antifakeInformation;

        //-------------开始绘制文字--------------
        if (!TextUtils.isEmpty(watermarkText)) {
            int screenWidth = getScreenWidth();

            float textSize = dp2px(mContext, 16) * bitmapWidth / screenWidth;
            // 创建画笔
            TextPaint mPaint = new TextPaint();
            // 文字矩阵区域
            Rect textBounds = new Rect();
            // 水印的字体大小
            mPaint.setTextSize(textSize);
            // 文字阴影
            mPaint.setShadowLayer(0.5f, 0f, 1f, Color.YELLOW);
            // 抗锯齿
            mPaint.setAntiAlias(true);
            // 水印的区域
            mPaint.getTextBounds(watermarkText, 0, watermarkText.length(), textBounds);
            // 水印的颜色
            mPaint.setColor(Color.BLUE);
            StaticLayout layout = new StaticLayout(watermarkText, 0, watermarkText.length(), mPaint, (int) (bitmapWidth - textSize),
                    Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.5F, true);
            // 文字开始的坐标
            float textX = dp2px(mContext, 8) * bitmapWidth / screenWidth;
            //float textY = bitmapHeight / 2;//图片的中间
            float textY = dp2px(mContext, 8) * bitmapHeight / screenWidth;
            // 画文字
            canvas.translate(textX, textY);
            layout.draw(canvas);
        }
        //保存所有元素
        canvas.save();
        canvas.restore();
        return bmp;
    }

    /**
     * @Description 保存水印图片
     * @param saveWatermarkPath 保存路径
     */
    public static void savaWaterparkFile(String saveWatermarkPath) {

        Bitmap watermark = createWatermark(mResources,mPhotoGraphed,mPhotoDate,mIllicitCode,mIllicitBehavior,mEquipmentNumber,mAntifakeInformation);
        File watermarkfile = new File(saveWatermarkPath);
        if (!watermarkfile.exists()) {
            watermarkfile.mkdir();
        }
        // 创建媒体文件名
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
        File file = new File(watermarkfile.getPath() + File.separator + timeStamp + ".jpg");
        if(file!=null){
            Log.e(TAG, "savaWaterparkFile: success ");
        }else{
            Log.e(TAG, "savaWaterparkFile: failure ");
        }
        BufferedOutputStream bos = null;
        try {
            bos = new BufferedOutputStream(new FileOutputStream(file));
            if (watermark != null) {
                watermark.compress(Bitmap.CompressFormat.JPEG, 80, bos);

            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        try {
            bos.flush();
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    private static int getScreenWidth() {
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(dm);
        return dm.widthPixels;
    }

    private static int dp2px(Context context, float dp) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dp * scale + 0.5f);
    }

}

 -----------------------------activity_main-----------------------------

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="#cccccc"
    android:orientation="vertical">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="centerCrop"
        android:id="@+id/image"/>


</LinearLayout>

---------------- babygirl.jpg --------------

猜你喜欢

转载自blog.csdn.net/qq_40116418/article/details/86598252