zoukankan      html  css  js  c++  java
  • Android给图片加文字和图片水印

    我们在做项目的时候有时候需要给图片添加水印,水寒今天就遇到了这样的问题,所以搞了一个工具类,贴出来大家直接调用就行。

    /**
     * 图片工具类
     * @author 水寒
     * 欢迎访问水寒的个人博客:http://www.sunhome.org.cn
     *
     */
    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, 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 Context
         * @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
         * @param paddingLeft
         * @param paddingTop
         * @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); 
        } 
    }

    使用方法如下:
    添加一个布局,上面是原始图片,下面是添加水印后的图片

    <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"
        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: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:scaleType="centerInside"/>
    
    </LinearLayout>

    (本文出自水寒的CSDN博客:http://blog.csdn.net/dawanganban
    在Activity中获取到ImageView对象,并且获取Bitmap对象,对Bitmap进行canva绘图,添加水印:

    /**
     * 图片工具类
     * @author 水寒
     * 欢迎访问水寒的个人博客:http://www.sunhome.org.cn
     *
     */
    public class MainActivity extends Activity {
    
        private ImageView mSourImage;
        private ImageView mWartermarkImage;
    
        @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);
            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);
            watermarkBitmap = ImageUtil.createWaterMaskLeftBottom(this, watermarkBitmap, waterBitmap, 0, 0);
            watermarkBitmap = ImageUtil.createWaterMaskRightBottom(this, watermarkBitmap, waterBitmap, 0, 0);
            watermarkBitmap = ImageUtil.createWaterMaskLeftTop(this, watermarkBitmap, waterBitmap, 0, 0);
            watermarkBitmap = ImageUtil.createWaterMaskRightTop(this, watermarkBitmap, waterBitmap, 0, 0);
    
            Bitmap textBitmap = ImageUtil.drawTextToLeftTop(this, watermarkBitmap, "左上角", 16, Color.RED, 0, 0);
            textBitmap = ImageUtil.drawTextToRightBottom(this, textBitmap, "右下角", 16, Color.RED, 0, 0);
            textBitmap = ImageUtil.drawTextToRightTop(this, textBitmap, "右上角", 16, Color.RED, 0, 0);
            textBitmap = ImageUtil.drawTextToLeftBottom(this, textBitmap, "左下角", 16, Color.RED, 0, 0);
            textBitmap = ImageUtil.drawTextToCenter(this, textBitmap, "中间", 16, Color.RED);
    
            mWartermarkImage.setImageBitmap(textBitmap);
        }
    }
  • 相关阅读:
    [置顶] java得到前一个月的年月日时分秒
    Windows 8.1 Preview的新功能和新API
    oracle保证读一致性原理
    10161
    Qt国际化
    使用Maven管理依赖JAR文件,自定义项目布局,利用ANT生成不同的发布包
    Haxe2.10到Haxe3,NME到OpenFL的迁移备忘
    设置RichEdit相关颜色说明
    使用MFC CImage类绘制PNG图片时遇到的问题
    把网球计分招式重构到状态模式
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468476.html
Copyright © 2011-2022 走看看