之前一篇给图片加水印的功能,加出来水印的图片位置有一点问题,并且如果图片分辨率有变动的话,水印会有层次不齐的问题。

目前只能优化到增加一条居中显示的斜水印,在不同分辨率不同大小的图片中,都能保证文字水印的字体大小从左下至右上能撑满整张图片。

思路是:先生成一张文字水印图片的PNG图片。

在你需要添加水印的图片上,把之前加的水印图片贴上去就可以了。

核心代码:

     //新建原始普通大小的bmp
Bitmap bmCanvas = new Bitmap(imgSrc.Width, imgSrc.Height, PixelFormat.Format24bppRgb);
Graphics gCanvas = Graphics.FromImage(bmCanvas);
gCanvas.Clear(Color.White);
gCanvas.SmoothingMode = SmoothingMode.HighQuality;
gCanvas.InterpolationMode = InterpolationMode.High;
//将原始图片加载入画布
gCanvas.DrawImage(imgSrc, , , imgSrc.Width, imgSrc.Height);
//计算图片对角线长度
double diagonal = Math.Sqrt(Math.Pow(width, ) + Math.Pow(height, )); //计算对角线倾角
double angle = Math.Asin(height / Math.Sqrt(Math.Pow(width, ) + Math.Pow(height, ))) / Math.PI * ; // 确定水印文字的字体大小
int[] sizes = new int[]
{
, , , , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , , , ,
, , , , , , , , , , , , , , , , , , , , , ,
, , , , , , , , ,
};
Font crFont = null;
SizeF crSize = new SizeF(); for (int i = ; i < sizes.Length; i++)
{
crFont = new Font("微软雅黑", sizes[i], FontStyle.Bold);
crSize = gCanvas.MeasureString(watermarkText, crFont);
if ((int)crSize.Width < (int)diagonal * 0.9)
{
break;
}
}
// 生成水印图片(将文字写到图片中)
//Bitmap bmWaterMark = new Bitmap((int)crSize.Width + 3, (int)crSize.Height + 3, PixelFormat.Format32bppArgb);
Bitmap bmWaterMark = new Bitmap(width, height, PixelFormat.Format32bppArgb);
Graphics gWaterMark = Graphics.FromImage(bmWaterMark); gWaterMark.TranslateTransform(width / , height / );
gWaterMark.RotateTransform(-(int)angle);
gWaterMark.TranslateTransform(-crSize.Width / , -crSize.Height / ); PointF pt = new PointF(, );
// 画阴影文字
Brush transparentBrush0 = new SolidBrush(Color.FromArgb(, Color.Black));
Brush transparentBrush1 = new SolidBrush(Color.FromArgb(, Color.Black));
gWaterMark.DrawString(watermarkText, crFont, transparentBrush0, pt.X, pt.Y + );
gWaterMark.DrawString(watermarkText, crFont, transparentBrush0, pt.X + , pt.Y);
gWaterMark.DrawString(watermarkText, crFont, transparentBrush1, pt.X + , pt.Y + );
gWaterMark.DrawString(watermarkText, crFont, transparentBrush1, pt.X, pt.Y + );
gWaterMark.DrawString(watermarkText, crFont, transparentBrush1, pt.X + , pt.Y);
transparentBrush0.Dispose();
transparentBrush1.Dispose(); // 画文字
gWaterMark.SmoothingMode = SmoothingMode.HighQuality;
//Brush SolidBrush3 = new SolidBrush(Color.White);
Brush solidBrush3 = new SolidBrush(Color.FromArgb(, Color.White));
gWaterMark.DrawString(watermarkText, crFont, solidBrush3, pt.X, pt.Y, StringFormat.GenericDefault);
solidBrush3.Dispose(); // 保存刚才的操作
gWaterMark.Save();
gWaterMark.Dispose();
bmWaterMark.Save(_wmImgSavePath, ImageFormat.Jpeg); //// 将水印图片加到原图中
//AddWatermarkImage(gCanvas, new Bitmap(bmWaterMark), "WM_TOP_LEFT", width, height); using (var imageAttr = new ImageAttributes())
{
ColorMap colorMap = new ColorMap();
colorMap.OldColor = Color.FromArgb(, , , );
colorMap.NewColor = Color.FromArgb(, , , );
ColorMap[] remapTable = { colorMap };
imageAttr.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
float[][] colorMatrixElements =
{
new float[] {1.0f, 0.0f, 0.0f, 0.0f, 0.0f},
new float[] {0.0f, 1.0f, 0.0f, 0.0f, 0.0f},
new float[] {0.0f, 0.0f, 1.0f, 0.0f, 0.0f},
new float[] {0.0f, 0.0f, 0.0f, 0.3f, 0.0f},
new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
};
ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
imageAttr.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
gCanvas.DrawImage(bmWaterMark, new Rectangle(, , bmWaterMark.Width, bmWaterMark.Height), , ,
bmWaterMark.Width, bmWaterMark.Height, GraphicsUnit.Pixel, imageAttr);
gCanvas.Dispose();
}
bmWaterMark.Dispose();

代码已上传至GitHub,地址:https://github.com/hano7758/WaterMark

c# 图文添加文字斜水印 优化的更多相关文章

  1. c# 图文添加文字斜水印

    项目中有个添加水印的需求,需要给图片铺满斜水印. 网上搜了半天全是添加在图片上.下.左.右的案例. 于是按照网上的某一段案例自己修改了一些代码. Bitmap bitmap = new Bitmap( ...

  2. ios图片添加文字或者水印

    在项目中,我们会对图片做一些处理,但是我们要记住,一般在客户端做图片处理的数量不宜太多,因为受设备性能的限制,如果批量的处理图片,将会带来交互体验性上的一些问题.首先让我们来看看在图片上添加文字的方法 ...

  3. php 使用GD库压缩图片,添加文字图片水印

    先上一个工具类,提供了压缩,添加文字.图片水印等方法: image.class.php <?php class Image { private $info; private $image; pu ...

  4. php 图片添加文字,水印

    因为工作需求,用到这个,网上找了很多,也没有找到好的方式,最后找到这种感觉比较简单的方式,记录下来,以备后用.   $im = imagecreatefrompng("img/yyk_bg. ...

  5. 用python给图片添加文字(水印)

    题目来源于:Python 练习册,每天一个小程序 第0000题 代码如下: #-*- coding:utf-8 -*- import PIL from PIL import Image from PI ...

  6. 给二维码(图片)添加文字(水印),让生成的二维码中间带logo

    <?php //生成二维码 require_once IA_ROOT . '/framework/library/qrcode/phpqrcode.php'; QRcode::png($url, ...

  7. javacpp-opencv图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体、位置、大小、粗度、翻转、平滑等操作

    欢迎大家积极开心的加入讨论群 群号:371249677 (点击这里进群) javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置. ...

  8. php 图片添加文字水印 以及 图片合成(微信快码传播)

    1.图片添加文字水印: $bigImgPath = 'backgroud.png'; $img = imagecreatefromstring(file_get_contents($bigImgPat ...

  9. 利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现

    1: 面向过程的编写方法 //指定图片路径 $src = '001.png'; //获取图片信息 $info = getimagesize($src); //获取图片扩展名 $type = image ...

随机推荐

  1. zookeeper源码 — 三、集群启动—leader、follower同步

    zookeeper集群启动的时候,首先读取配置,接着开始选举,选举完成以后,每个server根据选举的结果设置自己的角色,角色设置完成后leader需要和所有的follower同步.上面一篇介绍了le ...

  2. kotlin嵌套类

    就是类中定义类 package loaderman.demo class Outer { var name: String = "name" inner class inner { ...

  3. HTTP的响应协议

    响应行介绍,响应状态码 1XX: 客户端请求服务器,但是请求未完成,服务器什么事也没干 2XX: 表示响应成功,代表性的状态码就是200 3XX: 请求重定向,代表性的状态码302 4XX: 客户端发 ...

  4. Docker 官方安装详解

    # 0x00 安装热身 - 针对CE版本 Docker 分为 CE 和 EE 版本, CE免费,EE收费,CE版以及能够满足我们所有需求 本文针对 CE 版本的安装进行说明 - 系统说明 本文以 Ce ...

  5. 19 Flutter仿京东商城项目 商品详情 底部浮动导航布局 商品页面布局

    效果: widget/JdButton.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.da ...

  6. 阶段5 3.微服务项目【学成在线】_day05 消息中间件RabbitMQ_1.页面发布-需求分析

    先静态化,并存储到gridFS 然后,发消息给MQ,MQ接收到消息通知给所有监听他的Cms Client. Cms client从gridFS读取页面下载到自己的服务 业务流程如下:1.管理员进入管理 ...

  7. [C++]数据结构:线性表之顺序表

    1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...

  8. MYSQL的MYSQLDUMP命令

    1.用mysqldump对MySQL数据库进行数据备份与恢复 下面假设要备份tm这个数据库:Shell>mysqldump -uroot –p123456 tm > tm_050519.s ...

  9. postman+jmeter接口实例

    接口基础 一.为什么要单独测试接口? 1. 程序是分开开发的,前端还没有开发,后端已经开发完了,可以提前进入测试2. 接口直接返回的数据------越底层发现bug,修复成本是越低的3. 接口测试能模 ...

  10. Unity3d NavMeshAgent 寻路问题(1)

    navMeshAgent调用setDestination 后,会有一个计算路径的时间,计算过程中pathPending为true. 在这个过程中remainingDistance一直为0.