提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2010-12-21 17:12:14.000|阅读 824 次
概述:本文主要介绍.Net绘图如何给图片增加透明度,希望对大家有帮助。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
首先我们强调一下opacity的概念,是“不透明度”,它表示的是两个图层之间的关系,即该属性隶属于本图层,它表示与本图层下面图层之间的像素合成关系,当opacity=100%时,表示本图层完全不透明,因此下面的像素完全被遮挡。当opacity=0时,表示本图层完全透明,即能看到下面的图层。这是photoshop中最基本的一个算法,表达如下:
像素结果=底部图层*(1-opacity)+本图层*opacity;
当有多个图层x0,x1,x2混合时,表达如下:(最底层的不透明度为1)
x=((1-k1)x0+k1*x1)(1-k2)+k2*x2= (1-k1)(1-k2)x0 + k1(1-k2)x1 + k2*x2;
那么绘制透明度水印的方法也就非常直观了,因为类库中的ImageAttributes属性里面并没有提供像素合成的绘制选项,因此我们自己实现上面的算法。方法是:首先准备一个小的水印图片,我们先把原图在水印下面的部分绘制上去,然后在吧水印的文本或图片绘制上去,然后把原图和水印图片的内存数据锁定(防止操作系统移动内存),然后直接用上面的算法改写原图的位图数据,解锁内存即得到最终加了水印的图片。
代码如下:下面是绘制文本类型的水印,只需提供水印文本内容,绘制起始坐标即可。注意,为了简单直观起见,代码中都没有做参数验证,例如水印是否超出原图范围,如果超出范围将引发对超过内存边界的访问限制(引发异常)。下面使用了unsafe代码,因此项目属性->Build中,应勾选允许不安全代码,否则无法编译。 在下面代码中的定位方式是非常熟悉的。再次强调的是以下的概念:
scan0:指针,内存数据的起始地址。(换句话说,就是指向第一个扫描行第一个像素的Blue)。
bpp:bit per pixel。
stride:扫描行宽度,=width*bpp/8 并在结尾补0~3个字节的0,以凑齐到4字节整数倍。
之所以横坐标乘以3是因为我们锁定的方式是24bppRgb(最后一个参数指定了数据的bpp),这意味这每个像素占据了3个字节,因此i要乘以3来跳跃到下一个像素。如果用32bppRGB锁定,则每个像素在内存占据4字节,相应的i应该乘以4。
Code-文本水印
/// <summary>
/// 给一个位图绘制水印文字(没有验证水印是否超出图片边界!)
/// </summary>
/// <param name="text">水印文本</param>
/// <param name="x">起始点</param>
/// <param name="y">起始点</param>
/// <param name="opacity">不透明度,0~1</param>
private Bitmap DrawWatermark(Image image,string text, Font font,Brush brush,int x,int y,double opacity)
{
Bitmap bm1 = new Bitmap(image);
Graphics g1=Graphics.FromImage(bm1);
//测量水印文字的大小,然后申请一个新的位图
SizeF sizef=g1.MeasureString(text,font);
Bitmap bm2=new Bitmap((int)sizef.Width,(int)sizef.Height);
Graphics g2=Graphics.FromImage(bm2);
g2.DrawImage(bm1, 0,0,new Rectangle
(x, y, bm2.Width, bm2.Height),GraphicsUnit.Pixel);
g2.DrawString(text,font,brush,0,0);
BitmapData data1=bm1.LockBits(new Rectangle(0,0,bm1.Width,bm1.Height),
ImageLockMode.ReadWrite,PixelFormat.Format24bppRgb);
BitmapData data2=bm2.LockBits(new Rectangle(0,0,bm2.Width,bm2.Height),ImageLockMode.ReadWrite,
PixelFormat.Format24bppRgb);
unsafe
{
byte* p1=(byte*)(void*)data1.Scan0;
byte* p2=(byte*)(void*)data2.Scan0;
for(int j=0;j<bm2.Height;j++)
{
for(int i=0;i<bm2.Width*3;i++)
{
p1[(y+j)*data1.Stride+i]=(byte)(p1[(y+j)*data1.Stride+i]*
(1-opacity)+opacity*p2[j*data2.Stride+i]);
}
}
bm1.UnlockBits(data1);
bm2.UnlockBits(data2);
}
return bm1;
}
还有一种情况是,我们事先做作好水印,它是一个图片,更多的人在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 bm1 = new Bitmap(image); //克隆原图,它也是我们的返回值
Bitmap bm2 = new Bitmap(wmImg.Width, wmImg.Height); //准备的水印图片
Graphics g2 = Graphics.FromImage(bm2);
ImageAttributes att = new ImageAttributes();
att.SetColorKey(key, key, ColorAdjustType.Bitmap); //设定透明色
g2.DrawImage(bm1, 0, 0, new Rectangle(x, y, bm2.Width, bm2.Height),
GraphicsUnit.Pixel);
g2.DrawImage(wmImg, new Rectangle(0,0,bm2.Width,bm2.Height),0, 0,bm2.Width,bm2.Height,GraphicsUnit.Pixel,att);
g2.Dispose();
。。。。这里的代码和上面的方法代码相同,因此省略
return bm1;
}
以上两种效果的截图:
ASP.NET中如何使用unsafe选项
实际需要在ASP.NET中使用unsafe选项
集体的方法是:找到工程的web.config文件,在configuration节中加入:
<system.codedom>
<compilers>
<compiler
language="c#;cs;csharp" extension=".cs"
compilerOptions="/unsafe"
type="Microsoft.CSharp.CSharpCodeProvider, System, Version=
2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</compilers>
</system.codedom>
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢