打算写一个很小的软件,客户的需求是能对其现有的图片进行“处理”后输出。
现有素材:一些背景图片,一些人物图片,一些人物附件的图片(就是人物的鼻子,眼睛,嘴之类的小图片)
除背景图片外,都是有透明背景的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属性来获得图片的大小属性?希望大家能给点指教,有没有代码不重要,我可以慢慢摸,只要告诉我方法就行了,
越详细越好,谢谢大家了。

解决方案 »

  1.   

    1. 简单的说是图像的叠加?
    2. 用什么控件同问题没关系,
    你所说的蒙板指的是目标图中透明显示的区域? 可以让这些区域的像素的Alpha值 为0就实现透明。另外,你要设置的不是控件中某点的像素,是位图中某点的像素。设置像素不要用SetPixel。比较慢 。用Bitmap.LockBits方法。
      

  2.   

    新想法,继续顶一下。
    因为客户需要能手动调节除背景外的图片与背景的相对位置,所以有两种方法:
    1、用多个PictureBox控件来实现。
    2、用GDI+来重绘实现。
    那种方法相对简单又高效呢?(出现图像闪动的几率仅可能小)
    注:蒙板只能实现人物的轮廓,其它的附件都是在人物图片上方的,所以不用考虑蒙板与人物不配套的问题。
    具体用什么方法来实现呢?这个这方面的资料好像特别少,手头上只有VC++的材料,完全看不懂,希望大家帮忙!!
      

  3.   

    呵呵 。。肯定不应该 用多个PictureBox控件来实现 你可以看一下 Pain.net。当然你这个远没有那么复杂。你需要的是“层”(layer)的概念每个可调节的图像是个层对象,你要处理MouseDown,MouseMove事件来作判断并移动它们。。
      

  4.   

    问题1:将需要叠加的图像做成两组数据,其一为原图,名为A,其二为它的透明通道名为B。在目标图(名为C)上定位后,使用下列伪代码:如果B[x,y] == 1,则 C[x1,y1] = A[x,y];
    这是全部透明的部分,如果还有半透明的部分,则需要别的代码。
    问题2:不要使用C#提供的 setpixel 和 getpixel 函数,太慢了,我用的方法是使用指针,然后将整个位图的数据直接写成数组,效率高太多了,以前4万个24位色彩要做10分钟,和VB差不多,用这两个函数(分别是位图到数组和数组到位图)后,我都懒得去测速了,太快了。
    问题3,直接获取 picture1.bitmap.宽或高就行了。要实现客户手动调整,只需要将这三组数据做成全局或类似功能即可,如全局类的数据成员
      

  5.   

    再补充一下,如果要客户调整,还需要另一个数组D,其方法是 
    如果 B[x,y] == 1,
    则   D[x1,y1] = A[x,y]; 
    否则 D[x1,y1]= C[x,y];否则叠加部分将不可恢复地覆盖背景图