如何实现两个人脸照片的变换

        相信想做你的code这个视频很多人都看过. 视频里, 男主角一直在编一个程序. 程序最后的效果是: 窗口里一个人的脸渐渐变成了另外一个人的脸...最后男主角很开心啊...

        今天突发奇想, 产生一个疑问, 那个程序究竟是如何实现的? 思考了几分钟, 思路是这样:

        假定有A, B两张照片(都是同一像素大小,都是200*200), 图片都是一个一个的像素组成.先不要说把整张图片进行变换了, 就先讨论图片的其中一个点. 比如想把A图片的(0, 0)坐标的像素分10步变到B图(0, 0)坐标的颜色. 假设A图(0, 0)坐标这个点的RGB是(20, 20, 20), B图(0, 0)坐标这个点的RGB是(40, 80, 120). 在屏幕的(0, 0)坐标输出A图(0, 0)的原始RGB, 然后一步一步的变换, 每次变换R值增加2, G值增加6, B值增加10. 最后经过十次变换后, 图片A的点(0, 0)的颜色就变换成了B图点(0, 0)的颜色.

        这是假设的一个点, 对图片A的每个点进行变换的话, 可以做一个双重的for循环, 像这两个图片都是200*200像素的, 就这样写for循环:

int i, j;
for(i = 0; i < 200; i ++)
    for(j = 0; j < 200; j ++)
{
     // 对[i][j]坐标的颜色进行变换
}

        经过这样的循环, 理论上最后图片是变换成功了. 但是现实的效果是十分滑铁卢的.

        仅仅写了一个在for循环中把图片每个像素输出来, 运行起来就花费了很长很长很长很长时间...就更别提图片中每个像素的RGB值的增加变化然后再输出了... 我知道这个for循环计算量是十分十分十分大的...所以显示效果十分十分十分的挫...

using (Bitmap bmp = new Bitmap(@"C:\xie.jpg"))
{
   Bitmap bm = new Bitmap(1, 1); //画一个点,调整这个点的大小
   Graphics g = Graphics.FromHwnd(this.Handle);//这个点画在哪里
   int X,Y;
   for(X = 0; X<200;X++)
      for (Y = 0; Y < 200; Y++)
        {
          Color pixelColor = bmp.GetPixel(X, Y); //[X][Y]点坐标的颜色
          bm.SetPixel(0, 0, pixelColor);//"画点", 这个点的颜色
          g.DrawImageUnscaled(bm, X, Y);//开始在[X][Y]点画了
        }
}

        所以我不禁要问了, 这个人脸变换的程序究竟是用什么好的方法实现的? 视频中的效果是十分的流畅啊. 请指教.

posted @ 2010-04-07 21:04  Create Chen  阅读(8193)  评论(19编辑  收藏