Net绘图如何给图片增加透明度

Net绘图如何给图片增加透明度,第1张

首先我们强调一下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 Heightj++)

{

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#cscsharp extension= cs

pilerOptions= /unsafe

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

</pilers>

lishixinzhi/Article/program/net/201311/13652

1、先打开ps软件,然后选择ps软件左上角的文件并选择打开。

2、接着在电脑里面找到需要编辑的电子公章图案,将它打开。

3、将图片在ps里面打开来之后,继续点击文件里面的储存为,并将图片的格式保存为GIF。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/bake/11725031.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存