PocektPc2003使用蒙版图掉API合并图片

调用 API 中的 BitBlt 函数。

函数功能:该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。

函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);

参数:

hdcDest:指向目标设备环境的句柄。

nXDest:指定目标矩形区域左上角的X轴逻辑坐标。

nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。

nWidth:指定源和目标矩形区域的逻辑宽度。

nHeight:指定源和目标矩形区域的逻辑高度。

hdcSrc:指向源设备环境的句柄。

nXSrc:指定源矩形区域左上角的X轴逻辑坐标。

nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。

dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。

 

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Runtime.InteropServices;
  5. public class Win32Support
  6.     {
  7.         /// <summary>
  8.         /// Enumeration to be used for those Win32 function 
  9.         /// that return BOOL
  10.         /// </summary>
  11.         public enum Bool
  12.         {
  13.             False = 0,
  14.             True
  15.         };
  16.         /// <summary>
  17.         /// Enumeration for the raster operations used in BitBlt.
  18.         /// In C++ these are actually #define. But to use these
  19.         /// constants with C#, a new enumeration type is defined.
  20.         /// </summary>
  21.         public enum TernaryRasterOperations
  22.         {
  23.             //SRCCOPY:将源矩形区域直接拷贝到目标矩形区域
  24.             SRCCOPY = 0x00CC0020, // dest = source
  25.             //SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并
  26.             SRCPAINT = 0x00EE0086, // dest = source OR dest
  27.             //SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并
  28.             SRCAND = 0x008800C6, // dest = source AND dest
  29.             //SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并
  30.             SRCINVERT = 0x00660046, // dest = source XOR dest
  31.             //SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并
  32.             SRCERASE = 0x00440328, // dest = source AND (NOT dest)
  33.             //NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
  34.             NOTSRCCOPY = 0x00330008, // dest = (NOT source)将位图做NOT运算
  35.             //NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反
  36.             NOTSRCERASE = 0x001100A6, // dest = (NOT src) AND (NOT dest)先将位图与目的DC做OR运算,再将其做NOT运算
  37.             //MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
  38.             MERGECOPY = 0x00C000CA, // dest = (source AND pattern)将选择的画刷与位图做AND运算
  39.             //MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
  40.             MERGEPAINT = 0x00BB0226, // dest = (NOT source) OR dest 先将位图做NOT运算,再与目的DC做OR运算
  41.             //PATCOPY:将特定的模式拷贝到目标位图上。
  42.             PATCOPY = 0x00F00021, // dest = pattern 将选择的画刷贴到目的DC
  43.             //PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
  44.             PATPAINT = 0x00FB0A09, // dest = DPSnoo
  45.             //PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并
  46.             PATINVERT = 0x005A0049, // dest = pattern XOR dest 将目的DC与选择的画刷做XOR运算
  47.             //DSTINVERT:表示使目标矩形区域颜色取反。
  48.             DSTINVERT = 0x00550009, // dest = (NOT dest) 将目的DC做NOT运算
  49.             //BLACKNESS表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
  50.             BLACKNESS = 0x00000042, // dest = BLACK 将位图转换为黑色
  51.             //WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)
  52.             WHITENESS = 0x00FF0062, // dest = WHITE
  53.         };
  54.         /// <summary>
  55.         /// BitBlt
  56.         /// </summary>
  57.         /// <param name="hObject">背景图片句柄。</param>
  58.         /// <param name="nXDest">从背景图片X坐标处画。</param>
  59.         /// <param name="nYDest">从背景图片Y坐标处画。</param>
  60.         /// <param name="nWidth">在背景图片上画多宽。</param>
  61.         /// <param name="nHeight">在背景图片上画多高。</param>
  62.         /// <param name="hObjSource">要画上去的图片句柄。</param>
  63.         /// <param name="nXSrc">从要画上去的图片的X坐标处画。</param>
  64.         /// <param name="nYSrc">从要画上去的图片的Y坐标处画。</param>
  65.         /// <param name="dwRop">运算方式。</param>
  66.         /// <returns>如果函数成功,那么返回值非零;如果函数失败,则返回值为零。Windows NT:若想获取更多错误信息,请调用GetLastError函数。</returns>
  67.         [DllImport("coredll.dll", EntryPoint = "BitBlt")]//PocektPc 的 API 封装在 coredll.dll  中 EntryPoint 为调用coredll.dll中的哪个方法,extern 表示此方法在外部实现,实现 API 中的方法必须用 Static 修饰
  68.         public static extern Bool BitBlt(
  69.             IntPtr hObject,
  70.             int nXDest, int nYDest,
  71.             int nWidth, int nHeight,
  72.             IntPtr hObjSource, int nXSrc, int nYSrc,
  73.             TernaryRasterOperations dwRop);
  74.     }

上面已将图片合成的核心代码写好了。

我们需要准备好所需的图片:

back.jpg

carton.jpg

 

通过反射获取到图片资源carton.jpg:

Image source = new Bitmap(System.Reflection.Assembly.GetExecutingAssembly()
.GetManifestResourceStream("LouKong.carton.jpg"));

 

定义全局变量用来控制获取高度

 int image = 0;

 

实现窗体重绘事件 Paint

  1.  private void Form1_Paint(object sender, PaintEventArgs e)
  2.         {            
  3.             using (Image back = new Bitmap(System.Reflection.Assembly.GetExecutingAssembly()
  4.                         .GetManifestResourceStream("LouKong.back.jpg")))
  5.             {
  6.                 Graphics backGrp = Graphics.FromImage(back);
  7.                 Graphics souceGrp = Graphics.FromImage(source);
  8.                 IntPtr bp = backGrp.GetHdc();
  9.                 IntPtr sp = souceGrp.GetHdc();
  10.                 int height = image * source.Height / 2;
  11.                 Win32Support.BitBlt(bp, 20, 20, source.Width / 2, source.Height / 2, sp, source.Width / 2, height, Win32Support.TernaryRasterOperations.SRCAND);
  12.                 Win32Support.BitBlt(bp, 20, 20, source.Width / 2, source.Height / 2, sp, 0, height, Win32Support.TernaryRasterOperations.SRCPAINT);
  13.                 backGrp.ReleaseHdc(bp);//释放句柄
  14.                 souceGrp.ReleaseHdc(sp);//释放句柄
  15.                 e.Graphics.DrawImage(back, 0, 0);
  16.             }
  17.         }

在Timer时间中:

  1. private void timer1_Tick(object sender, EventArgs e)
  2.         {
  3.             if (image == 0)
  4.                 image = 1;
  5.             else
  6.                 image = 0;
  7.             this.Refresh();
  8.         }

在 Form_load事件中启动Timer

timer1.Enabled = true;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值