知识大全 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绘图技术 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 图片格式目前网站开发常见的图片
ASP.NET绘图 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! privatevoidDraw
ASP.NET用OWC绘图控件画统计图表 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! OWC提
Windows窗体中如何使用透明图片和标签 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 昨天一
知识大全 如何用Photoshop修改PNG图片颜色,背景仍需透明,详细,徐步骤,谢谢
如何用Photoshop修改PNG图片颜色,背景仍需透明,详细,徐步骤,谢谢! 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,
Asp.net把图片存入数据库和读取图片的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 网
.Net图片处理函数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!cha138/Arti
ASP.NET显示渐变图片 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 用ASPNET编写能够
.Net在SqlServer中的图片存取 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本文总结
KindEditor图片上传Asp.net代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb