知识大全 Net绘图如何给图片增加透明度

Posted 水印

篇首语:一知半解的人,多不谦虚;见多识广有本领的人,一定谦虚。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Net绘图如何给图片增加透明度相关的知识,希望对你有一定的参考价值。

Net绘图如何给图片增加透明度  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  首先我们强调一下opacity的概念 是 不透明度 它表示的是两个图层之间的关系 即该属性隶属于本图层 它表示与本图层下面图层之间的像素合成关系 当opacity= %时 表示本图层完全不透明 因此下面的像素完全被遮挡 当opacity= 时 表示本图层完全透明 即能看到下面的图层 这是photoshop中最基本的一个算法 表达如下

  像素结果=底部图层*( opacity)+本图层*opacity;

  当有多个图层x x x 混合时 表达如下 (最底层的不透明度为 )

  x=(( k )x +k *x )( k )+k *x = ( k )( k )x + k ( k )x + k *x ;

  那么绘制透明度水印的方法也就非常直观了 因为类库中的ImageAttributes属性里面并没有提供像素合成的绘制选项 因此我们自己实现上面的算法 方法是 首先准备一个小的水印图片 我们先把原图在水印下面的部分绘制上去 然后在吧水印的文本或图片绘制上去 然后把原图和水印图片的内存数据锁定(防止操作系统移动内存) 然后直接用上面的算法改写原图的位图数据 解锁内存即得到最终加了水印的图片

  代码如下 下面是绘制文本类型的水印 只需提供水印文本内容 绘制起始坐标即可 注意 为了简单直观起见 代码中都没有做参数验证 例如水印是否超出原图范围 如果超出范围将引发对超过内存边界的访问限制(引发异常) 下面使用了unsafe代码 因此项目属性 >Build中 应勾选允许不安全代码 否则无法编译 在下面代码中的定位方式是非常熟悉的 再次强调的是以下的概念

  scan 指针 内存数据的起始地址 (换句话说 就是指向第一个扫描行第一个像素的Blue)

  bpp bit per pixel

  stride 扫描行宽度 =width*bpp/ 并在结尾补 ~ 个字节的 以凑齐到 字节整数倍

  之所以横坐标乘以 是因为我们锁定的方式是 bppRgb(最后一个参数指定了数据的bpp) 这意味这每个像素占据了 个字节 因此i要乘以 来跳跃到下一个像素 如果用 bppRGB锁定 则每个像素在内存占据 字节 相应的i应该乘以

  Code 文本水印

  /// <summary>

  /// 给一个位图绘制水印文字(没有验证水印是否超出图片边界!)

  /// </summary>

  /// <param name= text >水印文本</param>

  /// <param name= x >起始点</param>

  /// <param name= y >起始点</param>

  /// <param name= opacity >不透明度 ~ </param>

  private Bitmap DrawWatermark(Image image string text Font font Brush brush int x int y double opacity)

  

  Bitmap bm = new Bitmap(image);

  Graphics g =Graphics FromImage(bm );

  //测量水印文字的大小 然后申请一个新的位图

  SizeF sizef=g MeasureString(text font);

  Bitmap bm =new Bitmap((int)sizef Width (int)sizef Height);

  Graphics g =Graphics FromImage(bm );

  g DrawImage(bm new Rectangle(x y bm Width bm Height) GraphicsUnit Pixel);

  g DrawString(text font brush );

  BitmapData data =bm LockBits(new Rectangle( bm Width bm Height) ImageLockMode ReadWrite PixelFormat Format bppRgb);

  BitmapData data =bm LockBits(new Rectangle( bm Width bm Height) ImageLockMode ReadWrite PixelFormat Format bppRgb);

  unsafe

  

  byte* p =(byte*)(void*)data Scan ;

  byte* p =(byte*)(void*)data Scan ;

  for(int j= ;j<bm Height;j++)

  

  for(int i= ;i<bm Width* ;i++)

  

  p [(y+j)*data Stride+i]=(byte)(p [(y+j)*data Stride+i]*( opacity)+opacity*p [j*data Stride+i]);

  

  

  bm UnlockBits(data );

  bm UnlockBits(data );

  

  return bm ;

  

  还有一种情况是 我们事先做作好水印 它是一个图片 更多的人在photoshop中使用一个自己设计好的logo 保存为一个 画笔形状 制作时只要选中此画笔一盖就好了 实际上这种类型的水印是一个图片 为了加这种类型的水印 引入下面的overload方法 指定水印图片和透明色

  Code 图片水印

  /// <param name= image >原图</param>

  /// <param name= wmImg >水印图片</param>

  /// <param name= key >透明色</param>

  /// <param name= x >起始点</param>

  /// <param name= y ></param>

  /// <param name= opacity >不透明度</param>

  /// <returns></returns>

  private Bitmap DrawWatermark(Image image Bitmap wmImg Color key int x int y double opacity)

  

  Bitmap bm = new Bitmap(image);    //克隆原图 它也是我们的返回值

  Bitmap bm = new Bitmap(wmImg Width wmImg Height);    //准备的水印图片

  Graphics g = Graphics FromImage(bm );

  ImageAttributes att = new ImageAttributes();

  att SetColorKey(key key ColorAdjustType Bitmap);    //设定透明色

  g DrawImage(bm new Rectangle(x y bm Width bm Height) GraphicsUnit Pixel);

  g DrawImage(wmImg new Rectangle( bm Width bm Height) bm Width bm Height GraphicsUnit Pixel att);

  g Dispose();

   这里的代码和上面的方法代码相同 因此省略

  return bm ;

  

  以上两种效果的截图

        ( )                                                                ( )

  ASP NET中如何使用unsafe选项

  实际需要在ASP NET中使用unsafe选项

  集体的方法是 找到工程的nfig文件 在configuration节中加入:

  <dedom>

  <pilers>

  <piler

  language= c#;cs;csharp extension= cs

  pilerOptions= /unsafe

  type= Microsoft CSharp CSharpCodeProvider System Version= Culture=neutral PublicKeyToken=b a c e />

  </pilers>

cha138/Article/program/net/201311/13652

相关参考

知识大全 浅析PHP绘图技术

浅析PHP绘图技术  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  图片格式目前网站开发常见的图片

知识大全 ASP.NET 绘图

ASP.NET绘图  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  privatevoidDraw

知识大全 ASP.NET用OWC绘图控件画统计图表

ASP.NET用OWC绘图控件画统计图表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  OWC提

知识大全 Windows窗体中如何使用透明图片和标签

Windows窗体中如何使用透明图片和标签  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  昨天一

知识大全 如何用Photoshop修改PNG图片颜色,背景仍需透明,详细,徐步骤,谢谢

如何用Photoshop修改PNG图片颜色,背景仍需透明,详细,徐步骤,谢谢!  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,

知识大全 Asp.net把图片存入数据库和读取图片的方法

Asp.net把图片存入数据库和读取图片的方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  网

知识大全 .Net图片处理函数

.Net图片处理函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138/Arti

知识大全 ASP.NET显示渐变图片

ASP.NET显示渐变图片  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  用ASPNET编写能够

知识大全 .Net在SqlServer中的图片存取

.Net在SqlServer中的图片存取  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文总结

知识大全 KindEditor图片上传Asp.net代码

KindEditor图片上传Asp.net代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb