打算写一个很小的软件,客户的需求是能对其现有的图片进行“处理”后输出。
现有素材:一些背景图片,一些人物图片,一些人物附件的图片(就是人物的鼻子,眼睛,嘴之类的小图片)
除背景图片外,都是有透明背景的PNG图片。
要求:把人物附件与人物,人物与背景,按照数据库里的数据进行定位调整后输出BMP图像。
由于MicroS???哪个SB做的东西不支持PNG,所以打算直接使用透明图像的想法失败。
好在客户那里有人物的“蒙板图片”,我可以使用蒙板来得到透明背景的人物图像。另外人物的配件图片的背景都是固定的,打算通过计算图像四周的背景颜色区域,绘制到PictureBox
控件中来实现,但是由于小弟是第一次接触C#的图形图像,所以想问一下大家这个的思路是什么?
几个问题:
1、背景是一个单独的PictureBox控件,上面是透明背景的人物PictureBox,那么,用什么方法来
实现BMP图片与其BMP蒙板文件的透明效果?我光知道是用位来异或,但是不知道用什么方法?
2、“人物附件图片”想要读取PictureBox中某个点的像素是用GetPixet之类的函数么?如果画该点是用
SetXXXX之类的函数吧,但是如何才能让哪个点的颜色是透明的呢?用带Alpha那个函数么?
3、如果想知道导入PictureBox的图片的大小,PictureBox可以直接获得么,还是先将PictureBox
AutoSize到图片的大小,并用PIcBox的Width和Height属性来获得图片的大小属性?希望大家能给点指教,有没有代码不重要,我可以慢慢摸,只要告诉我方法就行了,
越详细越好,谢谢大家了。
现有素材:一些背景图片,一些人物图片,一些人物附件的图片(就是人物的鼻子,眼睛,嘴之类的小图片)
除背景图片外,都是有透明背景的PNG图片。
要求:把人物附件与人物,人物与背景,按照数据库里的数据进行定位调整后输出BMP图像。
由于MicroS???哪个SB做的东西不支持PNG,所以打算直接使用透明图像的想法失败。
好在客户那里有人物的“蒙板图片”,我可以使用蒙板来得到透明背景的人物图像。另外人物的配件图片的背景都是固定的,打算通过计算图像四周的背景颜色区域,绘制到PictureBox
控件中来实现,但是由于小弟是第一次接触C#的图形图像,所以想问一下大家这个的思路是什么?
几个问题:
1、背景是一个单独的PictureBox控件,上面是透明背景的人物PictureBox,那么,用什么方法来
实现BMP图片与其BMP蒙板文件的透明效果?我光知道是用位来异或,但是不知道用什么方法?
2、“人物附件图片”想要读取PictureBox中某个点的像素是用GetPixet之类的函数么?如果画该点是用
SetXXXX之类的函数吧,但是如何才能让哪个点的颜色是透明的呢?用带Alpha那个函数么?
3、如果想知道导入PictureBox的图片的大小,PictureBox可以直接获得么,还是先将PictureBox
AutoSize到图片的大小,并用PIcBox的Width和Height属性来获得图片的大小属性?希望大家能给点指教,有没有代码不重要,我可以慢慢摸,只要告诉我方法就行了,
越详细越好,谢谢大家了。
解决方案 »
- C#导出Excel速度慢的解决方案
- 问基础 傻问题
- 急! Jmail组件中不能用smtp.gmail.com作服务器发送邮件!!
- 我是菜鸟,c#字符型转换为数值型,怎么写?
- 哪为能提供一个可以编译运行的asp.net日期控件 自带的日期控件不好用
- 模拟windows框选
- 一个DataList中嵌套一个DataGrid,如何将DataGrid显示出来记录的字符截掉!
- 请问如何 判断 一个字符串中有多少个 汉字 多少个 英文字符?
- 送分贴
- 咨询csdn:发表了top文章,能不能给我寄本书?散分200庆贺
- 为什么我的程序中,propertygrid的键盘事件无效(vs2003)
- vs2005.netc#前台与后台(被简单的知识困惑)
2. 用什么控件同问题没关系,
你所说的蒙板指的是目标图中透明显示的区域? 可以让这些区域的像素的Alpha值 为0就实现透明。另外,你要设置的不是控件中某点的像素,是位图中某点的像素。设置像素不要用SetPixel。比较慢 。用Bitmap.LockBits方法。
因为客户需要能手动调节除背景外的图片与背景的相对位置,所以有两种方法:
1、用多个PictureBox控件来实现。
2、用GDI+来重绘实现。
那种方法相对简单又高效呢?(出现图像闪动的几率仅可能小)
注:蒙板只能实现人物的轮廓,其它的附件都是在人物图片上方的,所以不用考虑蒙板与人物不配套的问题。
具体用什么方法来实现呢?这个这方面的资料好像特别少,手头上只有VC++的材料,完全看不懂,希望大家帮忙!!
这是全部透明的部分,如果还有半透明的部分,则需要别的代码。
问题2:不要使用C#提供的 setpixel 和 getpixel 函数,太慢了,我用的方法是使用指针,然后将整个位图的数据直接写成数组,效率高太多了,以前4万个24位色彩要做10分钟,和VB差不多,用这两个函数(分别是位图到数组和数组到位图)后,我都懒得去测速了,太快了。
问题3,直接获取 picture1.bitmap.宽或高就行了。要实现客户手动调整,只需要将这三组数据做成全局或类似功能即可,如全局类的数据成员
如果 B[x,y] == 1,
则 D[x1,y1] = A[x,y];
否则 D[x1,y1]= C[x,y];否则叠加部分将不可恢复地覆盖背景图