using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
namespace siteadmin.admin
{
public class ImageWaterMark
{
/// <summary>
/// 图片水印
/// </summary>
/// <param name="img">图片</param>
/// <param name="filename">保存文件名</param>
/// <param name="watermarkFilename">水印文件名</param>
/// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下</param>
/// <param name="quality">附加水印图片质量,0-100</param>
/// <param name="watermarkTransparency">水印的透明度 1--10 10为不透明</param>
public static void AddImageSignPic(Image img, string filename, string watermarkFilename, int watermarkStatus, int quality, int watermarkTransparency)
{
Graphics g = Graphics.FromImage(img);
//设置高质量插值法
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
//设置高质量,低速度呈现平滑程度
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
Image watermark = new Bitmap(watermarkFilename);
if (watermark.Height >= img.Height || watermark.Width >= img.Width)
{
return;
}
ImageAttributes imageAttributes = new ImageAttributes();
ColorMap colorMap = new ColorMap();
colorMap.OldColor = Color.FromArgb(255, 0, 255, 0);
colorMap.NewColor = Color.FromArgb(0, 0, 0, 0);
ColorMap[] remapTable = { colorMap };
imageAttributes.SetRemapTable(remapTable, ColorAdjustType.Bitmap);
float transparency = 0.5F;
if (watermarkTransparency >= 1 && watermarkTransparency <= 10)
{
transparency = (watermarkTransparency / 10.0F);
}
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, transparency, 0.0f},
new float[] {0.0f, 0.0f, 0.0f, 0.0f, 1.0f}
};
ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements);
imageAttributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
int xpos = 0;
int ypos = 0;
switch (watermarkStatus)
{
case 1:
xpos = (int)(img.Width * (float).01);
ypos = (int)(img.Height * (float).01);
break;
case 2:
xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
ypos = (int)(img.Height * (float).01);
break;
case 3:
xpos = (int)((img.Width * (float).99) - (watermark.Width));
ypos = (int)(img.Height * (float).01);
break;
case 4:
xpos = (int)(img.Width * (float).01);
ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
break;
case 5:
xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
break;
case 6:
xpos = (int)((img.Width * (float).99) - (watermark.Width));
ypos = (int)((img.Height * (float).50) - (watermark.Height / 2));
break;
case 7:
xpos = (int)(img.Width * (float).01);
ypos = (int)((img.Height * (float).99) - watermark.Height);
break;
case 8:
xpos = (int)((img.Width * (float).50) - (watermark.Width / 2));
ypos = (int)((img.Height * (float).99) - watermark.Height);
break;
case 9:
xpos = (int)((img.Width * (float).99) - (watermark.Width));
ypos = (int)((img.Height * (float).99) - watermark.Height);
break;
}
g.DrawImage(watermark, new Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, GraphicsUnit.Pixel, imageAttributes);
//g.DrawImage(watermark, new System.Drawing.Rectangle(xpos, ypos, watermark.Width, watermark.Height), 0, 0, watermark.Width, watermark.Height, System.Drawing.GraphicsUnit.Pixel);
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType.IndexOf("jpeg") > -1)
{
ici = codec;
}
}
EncoderParameters encoderParams = new EncoderParameters();
long[] qualityParam = new long[1];
if (quality < 0 || quality > 100)
{
quality = 80;
}
qualityParam[0] = quality;
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
encoderParams.Param[0] = encoderParam;
if (ici != null)
{
img.Save(filename, ici, encoderParams);
}
else
{
img.Save(filename);
}
g.Dispose();
img.Dispose();
watermark.Dispose();
imageAttributes.Dispose();
}
/// <summary>
/// 文字水印
/// </summary>
/// <param name="img">图片</param>
/// <param name="filename">保存文件名</param>
/// <param name="watermarkText">水印文字</param>
/// <param name="watermarkStatus">图片水印位置 0=不使用 1=左上 2=中上 3=右上 4=左中 9=右下</param>
/// <param name="quality">附加水印图片质量,0-100</param>
/// <param name="fontname">字体</param>
/// <param name="fontsize">字体大小</param>
public static void AddImageSignText(Image img, string filename, string watermarkText, int watermarkStatus, int quality, string fontname, int fontsize)
{
Graphics g = Graphics.FromImage(img);
Font drawFont = new Font(fontname, fontsize, FontStyle.Regular, GraphicsUnit.Pixel);
SizeF crSize;
crSize = g.MeasureString(watermarkText, drawFont);
float xpos = 0;
float ypos = 0;
switch (watermarkStatus)
{
case 1:
xpos = (float)img.Width * (float).01;
ypos = (float)img.Height * (float).01;
break;
case 2:
xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
ypos = (float)img.Height * (float).01;
break;
case 3:
xpos = ((float)img.Width * (float).99) - crSize.Width;
ypos = (float)img.Height * (float).01;
break;
case 4:
xpos = (float)img.Width * (float).01;
ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
break;
case 5:
xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
break;
case 6:
xpos = ((float)img.Width * (float).99) - crSize.Width;
ypos = ((float)img.Height * (float).50) - (crSize.Height / 2);
break;
case 7:
xpos = (float)img.Width * (float).01;
ypos = ((float)img.Height * (float).99) - crSize.Height;
break;
case 8:
xpos = ((float)img.Width * (float).50) - (crSize.Width / 2);
ypos = ((float)img.Height * (float).99) - crSize.Height;
break;
case 9:
xpos = ((float)img.Width * (float).99) - crSize.Width;
ypos = ((float)img.Height * (float).99) - crSize.Height;
break;
}
g.DrawString(watermarkText, drawFont, new SolidBrush(Color.White), xpos + 1, ypos + 1);
g.DrawString(watermarkText, drawFont, new SolidBrush(Color.Black), xpos, ypos);
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType.IndexOf("jpeg") > -1)
{
ici = codec;
}
}
EncoderParameters encoderParams = new EncoderParameters();
long[] qualityParam = new long[1];
if (quality < 0 || quality > 100)
{
quality = 80;
}
qualityParam[0] = quality;
EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qualityParam);
encoderParams.Param[0] = encoderParam;
if (ici != null)
{
img.Save(filename, ici, encoderParams);
}
else
{
img.Save(filename);
}
g.Dispose();
//bmp.Dispose();
img.Dispose();
}
}
}
分享到:
相关推荐
本篇文章将详细探讨“编辑人员转帖去水印工具”,并介绍如何使用名为Teorex Inpaint的1.0.0.2版本的软件来实现这一目标。 首先,我们要理解什么是水印。水印通常是指在图像或视频中添加的半透明标记,它可以是文字...
根据提供的文件信息,我们可以推断出这是一篇关于如何使用特定的注册码来去除视频中的水印的文章。本文将详细探讨视频去水印的技术背景、原理、应用领域以及该注册码的具体使用方法等内容。 ### 一、视频去水印技术...
然而,在某些情况下,如内部文档分享或打印,水印可能会成为阻碍。Spire.Doc去水印版本正是为了解决这个问题。它提供了专门的API,允许开发者在代码中轻松移除Word文档中的水印,无论是文字型水印还是图像型水印,都...
本篇将详细讲解"一个可以去水印的网站解析接口.zip"所涉及的知识点。 首先,"去水印"是指从图像或视频中移除或减轻加注的标识,通常是商标、logo或其他版权信息。去水印技术主要分为两类:基于内容的去水印和基于元...
这篇介绍的是利用Visual C++(简称VC)编程环境实现的数字水印处理程序,它包含嵌入水印和提取水印两个关键过程,对于学习和研究数字水印技术以及进行毕业设计的同学来说具有很高的参考价值。 首先,我们需要理解...
本篇将深入探讨一种基于离散余弦变换(DCT)的数字水印算法,以及其在MATLAB环境下的实现方法。 离散余弦变换(Discrete Cosine Transform,DCT)是图像处理中常用的工具,特别是在图像压缩如JPEG格式中,DCT能够将...
本篇将围绕"去水印趣味实用工具小程序源码"这一主题,深入探讨其中涉及的关键技术点和功能实现。 首先,该小程序的核心功能之一是“去水印”。去水印技术主要涉及到图像处理,通过算法分析和处理图像中的水印信息,...
标题“图片水印小Demo同大家分享”暗示我们将讨论一个简易的图片水印应用示例,而描述则进一步提到了这个Demo的主要功能——将一个图片与另一个图片合成,让白色部分变得透明,同时规定了图像的宽度和颜色格式。...
在互联网内容分享中,视频是不可或缺的一部分,而视频外链技术和水印制作是提升内容质量、保护版权的重要手段。本文将深入探讨这两个方面,帮助您更好地理解和应用。 首先,我们来了解一下“视频外链技巧”。视频...
本篇文章将深入探讨一款名为"Spx截图工具(带撕边效果) 绿色特别版"的软件,它以其小巧、易用和独特的水印功能在市场上脱颖而出。 首先,我们来了解什么是“水印”。在数字图像处理中,水印通常是指在图片上添加的一...
前端可能提供一个视频链接输入框,用户输入短视频的分享链接,后端通过解析链接获取视频源,并运用算法去除水印。这个过程涉及到图像处理、视频编码等专业知识,需要一定的编程基础和对视频格式的理解。 总的来说,...
本篇文章将详细讲解如何利用Aspose.Words for Java库将PDF文档转换为Word(.doc或.docx)格式,并去除页码数量限制以及移除或替换水印。 Aspose.Words for Java是Aspose公司专门为Java开发者设计的一个强大的文档...
专业版支持不限时会议时长,最高 100 名参会者,联席主持人、设置屏幕共享水印、会议录制及免费版全部功能等。企业版支持不限时会议时长,300+名参会者,一对一客户服务、企业云端会议管理及专业版全部功能等。 4.2...
在保护文件安全性方面,添加水印到PDF文件是一个非常重要的步骤。使用iTextSharp命名空间,我们可以将水印添加到PDF文件中,以保护文件的安全性。 首先,我们需要添加iTextSharp命名空间的引用,以便使用iTextSharp...
首先,根据标题“php图片添加水印例子”,我们可以知道本文将分享一个用PHP实现图片添加水印的实例。水印的添加可以分为几个关键步骤,主要包括创建源图片资源、创建水印图片资源、设置水印位置以及将水印绘制到源...
在数码相机内部添加数字水印,可以确保照片在被分享或复制时,其原创性得到确认。 本文首先深入探讨了数字水印的理论基础,包括其原理、类型和应用。数字水印的实现通常分为嵌入和检测两个阶段,嵌入阶段是在原始...
本篇文章将详细讲解如何简单有效地去除图片中的水印。 首先,我们来理解一下什么是水印。水印可以是透明或半透明的文字、图案或logo,被嵌入到图片背景中,它可以是可见的,也可以是隐形的,通过特定软件才能检测到...
在本篇文章中,我们将设计一个图片工具类,名为ImageUtil,该类提供了多种图片处理方法,包括添加水印、图片裁剪、图片缩放等。 ImageUtil类的设计思路是将图片处理方法封装在一个类中,以便于在整个应用程序中重复...
《音视频-图像处理-论绝版水印版画研究》这篇论文主要探讨了将传统水印版画技艺与现代创新技术相结合,创造出一种新型的一次性水印版画创作方法。这一研究深入到图像处理领域,特别是针对音视频内容中的图像元素进行...