全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android给图片加文字和图片水印实例代码

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

/**
 * 图片工具类
 * @author 水寒
 *
 */
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>

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

/**
 * 图片工具类
 * @author 水寒
 *
 */
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);
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# android  # 图片添加水印  # 图片水印  # 图片加水印  # Android视频处理之动态时间水印效果  # Android添加水印的正确方法 只要三步!  # Android实现为图片添加水印  # Android 给图片加上水印的示例代码(支持logo+文字)  # Android给任何view添加全屏倾斜水印  # Android 图片添加水印的实现方法  # android实现文字水印效果 支持多行水印  # Android图片添加水印图片并把图片保存到文件存储的实现代码  # Android实现分享长图并且添加全图水印  # Android可配置透明度的水印  # 创建一个  # 标上  # 就行  # 贴出  # 将该  # 搞了  # 大家多多  # 方法如下  # 直接调用  # paddingRight  # createWaterMaskRightBottom  # paddingBottom  # createWaterMaskRightTop  # text  # drawTextToLeftTop  # createWaterMaskLeftBottom  # createWaterMaskCenter  # Canvas 


相关文章: 制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  制作公司内部网站有哪些,内网如何建网站?  如何选购建站域名与空间?自助平台全解析  如何通过建站之星自助学习解决操作问题?  建站之星代理如何优化在线客服效率?  建站之星如何实现五合一智能建站与营销推广?  如何快速生成可下载的建站源码工具?  网站制作费用多少钱,一个网站的运营,需要哪些费用?  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  如何选择高效便捷的WAP商城建站系统?  如何通过虚拟主机空间快速建站?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  焦点电影公司作品,电影焦点结局是什么?  深圳网站制作案例,网页的相关名词有哪些?  nginx修改上传文件大小限制的方法  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  建站主机如何安装配置?新手必看操作指南  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Python多线程使用规范_线程安全解析【教程】  广德云建站网站建设方案与建站流程优化指南  建站主机功能解析:服务器选择与快速搭建指南  建站之星后台管理:高效配置与模板优化提升用户体验  商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  高端建站三要素:定制模板、企业官网与响应式设计优化  成都网站制作公司哪家好,四川省职工服务网是做什么用?  如何在建站之星绑定自定义域名?  定制建站方案优化指南:企业官网开发与建站费用解析  青浦网站制作公司有哪些,苹果官网发货地是哪里?    建站OpenVZ教程与优化策略:配置指南与性能提升  如何快速搭建虚拟主机网站?新手必看指南  如何在宝塔面板中创建新站点?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  建站主机与服务器功能差异如何区分?  制作销售网站教学视频,销售网站有哪些?  php json中文编码为null的解决办法  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  全景视频制作网站有哪些,全景图怎么做成网页?  如何确保FTP站点访问权限与数据传输安全?  教学论文网站制作软件有哪些,写论文用什么软件 ?  TestNG的testng.xml配置文件怎么写 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。