广告位联系
返回顶部
分享到

C#实现给图片添加文字水印

C#教程 来源:互联网 作者:佚名 发布时间:2024-04-18 22:27:37 人浏览
摘要

在某些应用项目(如电子档案信息管理)中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。增加水印主要起到如下作用:

在某些应用项目(如电子档案信息管理)中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。增加水印主要起到如下作用:

1、防止盗图:图片加水印可以有效防止盗图,将文字水印嵌入到图片中作为特殊标记,可以在不影响图片质量的情况下保护版权,即使别人下载了图片,也可以通过水印追踪到图片的来源。

2、增加宣传效果:可以通过添加URL或其它宣传性文字,增加宣传效果。

开发运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C#

方法说明

AddWaterText 方法无返回值,具体参数说明请参照下表:

序号 参数名 类型 说明
1 oldpath string 原图片文件路径
2 text string 要添加的水印文字
3 newpath string 新输出图片文件路径
4 point object 设置文字起始位置坐标
5 font System.Drawing.Font 设置文字的字体
6 color System.Drawing.Color 设置文字的颜色
可使用 System.Drawing.Color.FromArgb(alpha, r, g,b)方法添加滤镜效果
7 rotate float 旋转角度值,默认值为 0.0f
8 textWidth int 文本预估宽度,默认值为1
9 textHeight int 文本预估高度,默认值为1
10 repeatD int 多水印文本间距值,默认值为0

方法代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

public void AddWaterText(string oldpath, string text, string newpath, object point, System.Drawing.Font font, System.Drawing.Color color, float rotate = 0.0f, int textWidth = 1,int textHeight=1, int repeatD=0)

        {

             

            try

            {

                FileStream fs = new FileStream(oldpath, FileMode.Open);

                BinaryReader br = new BinaryReader(fs);

                byte[] bytes = br.ReadBytes((int)fs.Length);

                br.Close();

                fs.Close();

                MemoryStream ms = new MemoryStream(bytes);

  

                System.Drawing.Image imgPhoto = System.Drawing.Image.FromStream(ms);

                int imgPhotoWidth = imgPhoto.Width;

                int imgPhotoHeight = imgPhoto.Height;

  

                Bitmap bmPhoto = new Bitmap(imgPhotoWidth, imgPhotoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

  

                bmPhoto.SetResolution(72, 72);

                Graphics gbmPhoto = Graphics.FromImage(bmPhoto);

                gbmPhoto.Clear(Color.FromName("white"));

                gbmPhoto.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;

                gbmPhoto.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

                gbmPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, imgPhotoWidth, imgPhotoHeight), 0, 0, imgPhotoWidth, imgPhotoHeight, GraphicsUnit.Pixel);

                System.Drawing.SizeF crSize = new SizeF();

                crSize = gbmPhoto.MeasureString(text, font);

                float y = imgPhotoHeight - crSize.Height;

                float x = imgPhotoWidth - crSize.Width;

  

                System.Drawing.StringFormat StrFormat = new System.Drawing.StringFormat();

                StrFormat.Alignment = System.Drawing.StringAlignment.Center;

  

                if(point!=null)

                {

                    System.Drawing.Point newpos=((System.Drawing.Point)point);

                    x=newpos.X;

                    y=newpos.Y;

                }

  

  

                System.Drawing.SolidBrush semiTransBrush = new System.Drawing.SolidBrush(color);

                System.Drawing.Color.FromArgb(1,1,1,1);

                gbmPhoto.RotateTransform(rotate);

                if (repeatD == 0)

                {

                    gbmPhoto.DrawString(text, font, semiTransBrush, x, y);

                }

                else

                {

                    int xcount = imgPhotoWidth/textWidth+3;

                    int ycount = imgPhotoHeight/textHeight+3;

                    float ox = x;

                    for (int k = 0; k < ycount; k++)

                    {

                        for (int i = 0; i < xcount; i++)

                        {

                            for (int j = 0; j < xcount; j++)

                            {

  

                                gbmPhoto.DrawString(text, font, semiTransBrush, x, y);

                            }

                            x += textWidth+repeatD;

                        }

                        x = ox;

                        y += textHeight+repeatD;

                    }

                }

                bmPhoto.Save(newpath, System.Drawing.Imaging.ImageFormat.Jpeg);

                gbmPhoto.Dispose();

                imgPhoto.Dispose();

                bmPhoto.Dispose();

            }

            catch

            {              

                ;              

            }

        }

调用示例

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

//获取源图片文件路径

string tempfile=Request.PhysicalApplicationPath+"\\app_data\\test.jpg";

//设置文字位置

System.Drawing.Point point = new System.Drawing.Point();

point.X = -10;

point.Y = -100;

//设置字体类

System.Drawing.Font font = new System.Drawing.Font("微软雅黑", 19, System.Drawing.FontStyle.Bold);

//设置字体滤镜值 ,和RGB分量颜色

int alpha = 25; int r = 255; int g = 0; int b = 255;

System.Drawing.Color color = System.Drawing.Color.FromArgb(alpha, r, g, b);

  

  

float rotate=30.0f; // 旋转角度

int textWidth = 100; //文本预估宽度

int textHeight=30; //文本预估高度

int repeatD=100; // 多水印文本间距,则表示多水印输出

  

//添加水印文字

string text="版权所有";

AddWaterText(tempfile,text,tempfile, point, font, color,rotate,textWidth,textHeight,repeatD);

  

File.Delete(tempfile);  //删除释放文件,在些之前可执行显示操作,如获取base64编码

显示效果如下图:

小结

AddWaterText 方法需要根据您实际应用中的图片大小动态调整参数,以达到满意的显示效果,如果文字起始位置,字体大小,水印间距等。您也可以改造本方法或应用,自动适应调整参数值。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 深入解析C#中的async和await关键字
    在软件开发中,异步编程是一项重要的技能,尤其是在处理IO密集型操作,如网络请求、数据库交互、文件读写等场景。C#语言中的async和a
  • C#实现给图片添加文字水印

    C#实现给图片添加文字水印
    在某些应用项目(如电子档案信息管理)中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水
  • C#实现将TextBox绑定为KindEditor富文本

    C#实现将TextBox绑定为KindEditor富文本
    关于KindEditor KindEditor 基于JavaScript 编写,可以与众多WEB应用程序结合。KindEditor 依靠出色的用户体验和领先的技术提供富文本编辑功能,是一
  • C# WPF编程之元素绑定介绍

    C# WPF编程之元素绑定介绍
    数据绑定是一种关系,该关系告诉WPF从源对象提取一下信息,并用这些信息设置目标对象的属性。目标属性始终是依赖项属性,通常位于W
  • QT升级6.0以上版本遇到问题以及解决方法
    最近重装QT的时候发现QT已经升级到了6.0以上的新版本。既然是重装,那就跟进新的更新。更新新的QT后以前的旧版本建立的工程,自然会出
  • C#实现窗体换肤的教程方法

    C#实现窗体换肤的教程方法
    实践过程 效果 代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 5
  • C#递归应用之实现JS文件的自动引用介绍

    C#递归应用之实现JS文件的自动引用介绍
    两张表,分别是 :sys_tbl,和 sys_field,其中:sys_tbl 是系统所有表的信息,包含两个字段 :code(表名),name(表描述信息);sys_fld 是记录第张
  • C#纯技术之Class写入Json介绍

    C#纯技术之Class写入Json介绍
    C# Class写入Json 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 /// summary /// 写入json文件 /// /summary /// param name=obj/param /// param name=save
  • C#实体类转换的两种方式总结
    C#实体类转换方式 将一个实体类的数据赋值到另一个实体类中(亦或者实现深拷贝)。 以下提供两种方式 一种是序列化 一种是泛型+反射
  • C#中的时间显示格式(12小时制VS24小时制)介绍
    C#时间显示格式 一起看下: 24小时制 1 this.toolStripStatusLabel1.Text = 您好,欢迎来到XXXX控制系统! + 当前时间: + DateTime.Now.ToString(yyyy-MM-dd HH
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计