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

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

思路是:先生成一张文字水印图片的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. IO调度 | Linux块设备中的IO路径及调度策略

    当文件系统通过submit_bio提交IO之后,请求就进入了通用块层.通用块层会对IO进行一些预处理的动作,其目的是为了保证请求能够更加合理的发送到底层的磁盘设备,尽量保证性能最佳.这里面比较重要的就 ...

  2. UML期末复习题——2.3:UML State Diagram

    第三题  状态图 重要概念: 1.定义:事件.状态和转换: 事件:指一件值得注意的事情的发生. 状态:指对象在事件发生之间某时刻所处的情形. 转换:两个状态之间的关系.它表明当某事件发生时,对象从先前 ...

  3. python笔记6 模块与包 程序开发规范 包 re sys time os模块

    模块与包 python 模块首引用加载到内存,如果再次引用此模块,直接从内存中读取. python文件分为:执行文件(解释器运行的文件),被引用文件(import) 模块引用一共发生了3件事: 1.他 ...

  4. Anaconda3详细安装使用教程及问题总结

    1.Anaconda是什么? 简单来说,Anaconda是Python的包管理器和环境管理器. 先来解决一个初学者都会问的问题:我已经安装了Python,那么为什么还需要Anaconda呢?原因有以下 ...

  5. failOnMissingWebXml

    使用maven创建项目时有时在pom.xml的war处出现failOnMissingWebXml的错误,根据错误提示的原因可以知道项目是web项目,打包时打成war包. 如果项目里没有web.xml, ...

  6. labelme

    项目:https://github.com/wkentaro/labelme?tdsourcetag=s_pcqq_aiomsg 说明:https://www.bilibili.com/video/a ...

  7. ffprobe读取音视频元数据信息,json格式输出

    命令格式: ffprobe -v quiet -show_format -show_streams -print_format json F:\temp\test1566606924822.wav 输 ...

  8. 移植Fatfs文件系统到工程中

    下载Fatfs文件管理系统:http://elm-chan.org/fsw/ff/archives.html 下载最新版本 在工程中新建Fatfs文件夹,把fatfs文件中的全部复制过来 由于Fatf ...

  9. C#程序 界面显示运行信息

    1.使用RichTextBox,难免要在多线程调用,所以需要委托. Color定义此条信息用什么颜色显示.可以不同的颜色显示不同的信息. private void ShowMsg(Color colo ...

  10. Java中处理OPC寄存器数据类型

    1. 在milo中,处理WORD等数据类型 例子如下: VariableNode node = client.getAddressSpace().createVariableNode( new Nod ...