Android给图片添加文字和水印

作者: 程序亦非猿580230 | 来源:发表于2018-10-25 11:13 被阅读20次

    话不多说 上图


    gif5新文件.gif
    public class ImageUtil {
        /**
         * 设置水印图片在左上角
         *
         * @param context     上下文
         * @param src
         * @param watermark
         * @param paddingLeft
         * @param paddingTop
         * @return
         */
        public static Bitmap createWaterMaskLeftTop(Context context, Bitmap src, Bitmap watermark, int paddingLeft, int paddingTop) {
            return createWaterMaskBitmap(src, watermark,
                    dp2px(context, paddingLeft), dp2px(context, paddingTop));
        }
    
        private static Bitmap createWaterMaskBitmap(Bitmap src, Bitmap watermark, int paddingLeft, int paddingTop) {
            if (src == null) {
                return null;
            }
            int width = src.getWidth();
            int height = src.getHeight();
            //创建一个bitmap
            Bitmap newb = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
            //将该图片作为画布
            Canvas canvas = new Canvas(newb);
            //在画布 0,0坐标上开始绘制原始图片
            canvas.drawBitmap(src, 0, 0, null);
            //在画布上绘制水印图片
            canvas.drawBitmap(watermark, paddingLeft, paddingTop, null);
            // 保存
            canvas.save(Canvas.ALL_SAVE_FLAG);
            // 存储
            canvas.restore();
            return newb;
        }
    
        /**
         * 设置水印图片在右下角
         *
         * @param context       上下文
         * @param src
         * @param watermark
         * @param paddingRight
         * @param paddingBottom
         * @return
         */
        public static Bitmap createWaterMaskRightBottom(Context context, Bitmap src, Bitmap watermark, int paddingRight, int paddingBottom) {
            return createWaterMaskBitmap(src, watermark,
                    src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight),
                    src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom));
        }
    
        /**
         * 设置水印图片到右上角
         *
         * @param context
         * @param src
         * @param watermark
         * @param paddingRight
         * @param paddingTop
         * @return
         */
        public static Bitmap createWaterMaskRightTop(Context context, Bitmap src, Bitmap watermark, int paddingRight, int paddingTop) {
            return createWaterMaskBitmap(src, watermark,
                    src.getWidth() - watermark.getWidth() - dp2px(context, paddingRight),
                    dp2px(context, paddingTop));
        }
    
        /**
         * 设置水印图片到左下角
         *
         * @param context
         * @param src
         * @param watermark
         * @param paddingLeft
         * @param paddingBottom
         * @return
         */
        public static Bitmap createWaterMaskLeftBottom(Context context, Bitmap src, Bitmap watermark, int paddingLeft, int paddingBottom) {
            return createWaterMaskBitmap(src, watermark, dp2px(context, paddingLeft),
                    src.getHeight() - watermark.getHeight() - dp2px(context, paddingBottom));
        }
    
        /**
         * 设置水印图片到中间
         *
         * @param src
         * @param watermark
         * @return
         */
        public static Bitmap createWaterMaskCenter(Bitmap src, Bitmap watermark) {
            return createWaterMaskBitmap(src, watermark,
                    (src.getWidth() - watermark.getWidth()) / 2,
                    (src.getHeight() - watermark.getHeight()) / 2);
        }
    
        /**
         * 给图片添加文字到左上角
         *
         * @param context
         * @param bitmap
         * @param text
         * @return
         */
        public static Bitmap drawTextToLeftTop(Context context, Bitmap bitmap, String text, int size, int color, int paddingLeft, int paddingTop) {
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(color);
            paint.setTextSize(dp2px(context, size));
            Rect bounds = new Rect();
            paint.getTextBounds(text, 0, text.length(), bounds);
            return drawTextToBitmap(context, bitmap, text, paint, bounds,
                    dp2px(context, paddingLeft),
                    dp2px(context, paddingTop) + bounds.height());
        }
    
        /**
         * 绘制文字到右下角
         *
         * @param context
         * @param bitmap
         * @param text
         * @param size
         * @param color
         * @return
         */
        public static Bitmap drawTextToRightBottom(Context context, Bitmap bitmap, String text, int size, int color, int paddingRight, int paddingBottom) {
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(color);
            paint.setTextSize(dp2px(context, size));
            Rect bounds = new Rect();
            paint.getTextBounds(text, 0, text.length(), bounds);
            return drawTextToBitmap(context, bitmap, text, paint, bounds,
                    bitmap.getWidth() - bounds.width() - dp2px(context, paddingRight),
                    bitmap.getHeight() - dp2px(context, paddingBottom));
        }
    
        /**
         * 绘制文字到右上方
         *
         * @param context
         * @param bitmap
         * @param text
         * @param size
         * @param color
         * @param paddingRight
         * @param paddingTop
         * @return
         */
        public static Bitmap drawTextToRightTop(Context context, Bitmap bitmap, String text, int size, int color, int paddingRight, int paddingTop) {
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(color);
            paint.setTextSize(dp2px(context, size));
            Rect bounds = new Rect();
            paint.getTextBounds(text, 0, text.length(), bounds);
            return drawTextToBitmap(context, bitmap, text, paint, bounds,
                    bitmap.getWidth() - bounds.width() - dp2px(context, paddingRight),
                    dp2px(context, paddingTop) + bounds.height());
        }
    
        /**
         * 绘制文字到左下方
         *
         * @param context
         * @param bitmap
         * @param text
         * @param size
         * @param color
         * @param paddingLeft
         * @param paddingBottom
         * @return
         */
        public static Bitmap drawTextToLeftBottom(Context context, Bitmap bitmap, String text, int size, int color, int paddingLeft, int paddingBottom) {
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(color);
            paint.setTextSize(dp2px(context, size));
            Rect bounds = new Rect();
            paint.getTextBounds(text, 0, text.length(), bounds);
            return drawTextToBitmap(context, bitmap, text, paint, bounds,
                    dp2px(context, paddingLeft),
                    bitmap.getHeight() - dp2px(context, paddingBottom));
        }
    
        /**
         * 绘制文字到中间
         *
         * @param context
         * @param bitmap
         * @param text
         * @param size
         * @param color
         * @return
         */
        public static Bitmap drawTextToCenter(Context context, Bitmap bitmap, String text, int size, int color) {
            Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
            paint.setColor(color);
            paint.setTextSize(dp2px(context, size));
            Rect bounds = new Rect();
            paint.getTextBounds(text, 0, text.length(), bounds);
            return drawTextToBitmap(context, bitmap, text, paint, bounds,
                    (bitmap.getWidth() - bounds.width()) / 2,
                    (bitmap.getHeight() + bounds.height()) / 2);
        }
    
        //图片上绘制文字
        private static Bitmap drawTextToBitmap(Context context, Bitmap bitmap, String text, Paint paint, Rect bounds, int paddingLeft, int paddingTop) {
            android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig();
    
            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);
    
            canvas.drawText(text, paddingLeft, paddingTop, paint);
            return bitmap;
        }
    
        /**
         * 缩放图片
         *
         * @param src
         * @param w
         * @param h
         * @return
         */
        public static Bitmap scaleWithWH(Bitmap src, double w, double h) {
            if (w == 0 || h == 0 || src == null) {
                return src;
            } else {
                // 记录src的宽高
                int width = src.getWidth();
                int height = src.getHeight();
                // 创建一个matrix容器
                Matrix matrix = new Matrix();
                // 计算缩放比例
                float scaleWidth = (float) (w / width);
                float scaleHeight = (float) (h / height);
                // 开始缩放
                matrix.postScale(scaleWidth, scaleHeight);
                // 创建缩放后的图片
                return Bitmap.createBitmap(src, 0, 0, width, height, matrix, true);
            }
        }
    
        /**
         * dip转pix
         *
         * @param context
         * @param dp
         * @return
         */
        public static int dp2px(Context context, float dp) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dp * scale + 0.5f);
        }
    }
    
    

    在Activity中获取到ImageView对象,并且获取Bitmap对象,对Bitmap进行canva绘图,添加水印

    public class MainActivity extends AppCompatActivity {
    
        private ImageView mSourImage;
        private ImageView mWartermarkImage;
        private ImageView mWartermarkImage2;
        private ImageView mWartermarkImage3;
        private ImageView mWartermarkImage4;
        private ImageView mWartermarkImage5;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initView();
        }
    
        private void initView() {
            mSourImage = (ImageView) findViewById(R.id.sour_pic);
            mWartermarkImage = (ImageView) findViewById(R.id.wartermark_pic);
            mWartermarkImage2 = (ImageView) findViewById(R.id.wartermark_pic2);
            mWartermarkImage3 = (ImageView) findViewById(R.id.wartermark_pic3);
            mWartermarkImage4 = (ImageView) findViewById(R.id.wartermark_pic4);
            mWartermarkImage5 = (ImageView) findViewById(R.id.wartermark_pic5);
            Bitmap sourBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sour_pic);
            mSourImage.setImageBitmap(sourBitmap);
    
            Bitmap waterBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.weixin);
    
            Bitmap watermarkBitmap = ImageUtil.createWaterMaskCenter(sourBitmap, waterBitmap);
            Bitmap watermarkBitmap2 = ImageUtil.createWaterMaskLeftBottom(this, sourBitmap, waterBitmap, 0, 0);
            Bitmap watermarkBitmap3 = ImageUtil.createWaterMaskRightBottom(this, sourBitmap, waterBitmap, 0, 0);
            Bitmap watermarkBitmap4 = ImageUtil.createWaterMaskLeftTop(this, sourBitmap, waterBitmap, 0, 0);
            Bitmap watermarkBitmap5 = ImageUtil.createWaterMaskRightTop(this, sourBitmap, waterBitmap, 0, 0);
    
            Bitmap textBitmap = ImageUtil.drawTextToLeftTop(this, watermarkBitmap4, "左上角", 16, Color.RED, 0, 0);
            Bitmap textBitmap2 = ImageUtil.drawTextToRightBottom(this, watermarkBitmap3, "右下角", 16, Color.RED, 0, 0);
            Bitmap textBitmap3 = ImageUtil.drawTextToRightTop(this, watermarkBitmap5, "右上角", 16, Color.RED, 0, 0);
            Bitmap textBitmap4 = ImageUtil.drawTextToLeftBottom(this, watermarkBitmap2, "左下角", 16, Color.RED, 0, 0);
            Bitmap textBitmap5 = ImageUtil.drawTextToCenter(this, watermarkBitmap, "中间", 16, Color.RED);
    
            mWartermarkImage.setImageBitmap(textBitmap);
            mWartermarkImage2.setImageBitmap(textBitmap2);
            mWartermarkImage3.setImageBitmap(textBitmap3);
            mWartermarkImage4.setImageBitmap(textBitmap4);
            mWartermarkImage5.setImageBitmap(textBitmap5);
        }
    }
    
    

    添加一个布局,上面是原始图片,下面是添加水印后的图片

    <ScrollView 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">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/sour_pic_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="原图" />
    
            <ImageView
                android:id="@+id/sour_pic"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="20dp"
                android:scaleType="centerInside" />
    
            <TextView
                android:id="@+id/watermark_pic_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="水印" />
    
            <ImageView
                android:id="@+id/wartermark_pic"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="20dp"
                android:scaleType="centerInside" />
    
            <ImageView
                android:id="@+id/wartermark_pic2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="20dp"
                android:scaleType="centerInside" />
    
            <ImageView
                android:id="@+id/wartermark_pic3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="20dp"
                android:scaleType="centerInside" />
    
            <ImageView
                android:id="@+id/wartermark_pic4"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="20dp"
                android:scaleType="centerInside" />
    
            <ImageView
                android:id="@+id/wartermark_pic5"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="20dp"
                android:scaleType="centerInside" />
    
        </LinearLayout>
    </ScrollView>
    

    相关文章

      网友评论

      • markRao:用java加水印会不会有点卡,换ndk做效率更高

      本文标题:Android给图片添加文字和水印

      本文链接:https://www.haomeiwen.com/subject/wujqtqtx.html