欢迎来到天天文库
浏览记录
ID:15438931
大小:39.00 KB
页数:12页
时间:2018-08-03
《c#图片处理之给你的图片打上logo》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、C#图片处理之给你的图片打上LOGOC#图片处理之:给你的图片打上LOGO做图片处理软件,肯定会遇到这样的需求:如何把一张图片放在另一张图片上,比如在大图片中打上公司或个人的Logo等等。其实原理很简单。假设我们有一张800*600的大图片(Bitmapb0),想在(10,10)的位置上打上Logo(Bitmapb1),Logo图片大小是150*30。很简单,我们以大图片的(10,10)位置作为起始位置,做一个150*30的矩形,把Logo图片整个替换这个矩形。老规矩,还是用BitmapData来帮助我们实现这个功能。//取以大图(X,Y)为起点,w
2、*h的矩形区域BitmapDatasrcData=b0.LockBits(newRectangle(X,Y,w,h),ImageLockMode.WriteOnly,PixelFormat.Format24bppRgb);//取整个LogoBitmapDatadstData=b1.LockBits(newRectangle(0,0,w,h),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);unsafe{byte*pIn=(byte*)srcData.Scan0.ToPointer();byte*p
3、Logo=(byte*)dstData.Scan0.ToPointer();for(inty=0;y4、Logo的功能就实现了。当然,还可以有别的方法,比如用BitBlt这个API函数,或者使用GDI+的DrawImage函数。但这样有个小问题,Logo区域永远是个矩形。假如我的Logo是个圆形,只希望在大图上出现圆形的Logo而不是整块矩形,那又该如何实现呢?这个问题其实可以这样理解:我们让Logo的背景变透明。而所谓透明,就是两张图片叠加时,上层图片“透明”区域中的像素,仍然使用下层图的相应像素来代替。但在RGB模式下,并没有“透明”这个概念(我们的讨论都在用PixelFormat.Format24bppRgb,PixelFormat.Format5、32bppArgb中的Alpha分量支持“透明度”),因此我们需要自己规定一种颜色,凡是这个颜色的,都作为“透明”处理。比如,我们的Logo是黑底的,那么就指定黑色作为透明色。修改算法也很简单,凡是遇到Logo图中像素颜色是黑色(当然这是个参数,可以自己改)的,就用大图相应位置的颜色来代替,否则还是使用Logo的像素色。下面是算法://因为有可能要回写,所以原图的ImageLockMode这次是ReadWriteBitmapDatasrcData=b0.LockBits(newRectangle(X,Y,w,h),ImageLockMode.Read6、Write,PixelFormat.Format24bppRgb);BitmapDatadstData=b1.LockBits(newRectangle(0,0,w,h),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);unsafe{byte*pIn=(byte*)srcData.Scan0.ToPointer();byte*pLogo=(byte*)dstData.Scan0.ToPointer();for(inty=0;y7、否透明色//取得当前色Colorc=Color.FromArgb(pLogo[2],pLogo[1],pLogo[0]);if(!ColorIsSimilar(c,TransColor,delta)){//不是透明色,b0当前位置的颜色用b1对应位置的来代替pIn[0]=(byte)pLogo[0];pIn[1]=(byte)pLogo[1];pIn[2]=(byte)pLogo[2];}pIn+=3;pLogo+=3;}pIn+=srcData.Stride-w*3;pLogo+=dstData.Stride-w*3;}b0.UnlockBits(8、srcData);b1.UnlockBits(dstData);}我们在上面的算法中出现了另一个小算法,判断
4、Logo的功能就实现了。当然,还可以有别的方法,比如用BitBlt这个API函数,或者使用GDI+的DrawImage函数。但这样有个小问题,Logo区域永远是个矩形。假如我的Logo是个圆形,只希望在大图上出现圆形的Logo而不是整块矩形,那又该如何实现呢?这个问题其实可以这样理解:我们让Logo的背景变透明。而所谓透明,就是两张图片叠加时,上层图片“透明”区域中的像素,仍然使用下层图的相应像素来代替。但在RGB模式下,并没有“透明”这个概念(我们的讨论都在用PixelFormat.Format24bppRgb,PixelFormat.Format
5、32bppArgb中的Alpha分量支持“透明度”),因此我们需要自己规定一种颜色,凡是这个颜色的,都作为“透明”处理。比如,我们的Logo是黑底的,那么就指定黑色作为透明色。修改算法也很简单,凡是遇到Logo图中像素颜色是黑色(当然这是个参数,可以自己改)的,就用大图相应位置的颜色来代替,否则还是使用Logo的像素色。下面是算法://因为有可能要回写,所以原图的ImageLockMode这次是ReadWriteBitmapDatasrcData=b0.LockBits(newRectangle(X,Y,w,h),ImageLockMode.Read
6、Write,PixelFormat.Format24bppRgb);BitmapDatadstData=b1.LockBits(newRectangle(0,0,w,h),ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);unsafe{byte*pIn=(byte*)srcData.Scan0.ToPointer();byte*pLogo=(byte*)dstData.Scan0.ToPointer();for(inty=0;y7、否透明色//取得当前色Colorc=Color.FromArgb(pLogo[2],pLogo[1],pLogo[0]);if(!ColorIsSimilar(c,TransColor,delta)){//不是透明色,b0当前位置的颜色用b1对应位置的来代替pIn[0]=(byte)pLogo[0];pIn[1]=(byte)pLogo[1];pIn[2]=(byte)pLogo[2];}pIn+=3;pLogo+=3;}pIn+=srcData.Stride-w*3;pLogo+=dstData.Stride-w*3;}b0.UnlockBits(8、srcData);b1.UnlockBits(dstData);}我们在上面的算法中出现了另一个小算法,判断
7、否透明色//取得当前色Colorc=Color.FromArgb(pLogo[2],pLogo[1],pLogo[0]);if(!ColorIsSimilar(c,TransColor,delta)){//不是透明色,b0当前位置的颜色用b1对应位置的来代替pIn[0]=(byte)pLogo[0];pIn[1]=(byte)pLogo[1];pIn[2]=(byte)pLogo[2];}pIn+=3;pLogo+=3;}pIn+=srcData.Stride-w*3;pLogo+=dstData.Stride-w*3;}b0.UnlockBits(
8、srcData);b1.UnlockBits(dstData);}我们在上面的算法中出现了另一个小算法,判断
此文档下载收益归作者所有