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

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

思路是:先生成一张文字水印图片的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. Flutter移动电商实战 --(32)列表页_小类高亮交互效果制作

    点击大类右侧的横向的小类红色显示当前的小类别 解决之前溢出的问题: 先解决一个bug,之前右侧的这里设置的高度是1000,但是有不同的虚拟机和手机设别的问题造成了溢出的问题 Expaned是有伸缩能力 ...

  2. 一个很好的开源视频播放器GiraffePlayer2(支持rtmp,rtsp,http,https)

    一个很好的开源视频播放器GiraffePlayer2(支持rtmp,rtsp,http,https) https://github.com/tcking/GiraffePlayer2 GiraffeP ...

  3. Mysql 清空数据后,释放硬盘文件

    删除表数据后执行:optimize table [表名]

  4. SQLW3School-高级:SQL TOP 子句

    ylbtech-SQLW3School-高级:SQL TOP 子句 1.返回顶部 1. TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的 ...

  5. SQL-W3School-基础:SQL DISTINCT 语句

    ylbtech-SQL-W3School-基础:SQL DISTINCT 语句 1.返回顶部 1. 本章讲解 SELECT DISTINCT 语句. SQL SELECT DISTINCT 语句 在表 ...

  6. C之交换数据案例

    //值传递 void swap(int i,int j){ printf("交换后:\n "); int tmp; tmp = i; i = j; j = tmp; } //引用传 ...

  7. 16Flutter中的路由 基本路由 基本路由跳转传值(上)

    /* Flutter中的普通路由.普通路由传值.命名路由.命名路由传值 Flutter中的路由通俗的讲就是页面跳转.在Flutter中通过Navigator组件管理路由导航. 并提供了管理堆栈的方法. ...

  8. hadoop异常: java.io.EOFException: Unexpected end of input stream

    执行hadoop任务时报错: -- ::, INFO [main] org.apache.hadoop.mapred.MapTask: Processing --//app1@flume23_1000 ...

  9. 在图中寻找最短路径-----深度优先算法C++实现

    求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例 ...

  10. java新特性stream

    java新特性stream,也称为流式编程. 在学习stream之前先了解一下java内置的四大函数 第一种函数式函数,后面是lambda表达式写法 /*Function<String,Inte ...