在c#中使用bitblt显示图片

时间:2022-01-03 06:38:01

using AForge.Video.DirectShow;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Drawing.Imaging;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Windows.Forms;

 

namespace HongYing.Test

{

    public partial class BitBltTester : Form

    {

        private VideoCaptureDevice videoSource;

 

        public BitBltTester()

        {

            InitializeComponent();

 

#if GDIPlus

            SetStyle(ControlStyles.OptimizedDoubleBuffer, true); //默认启动双缓冲

            SetStyle(ControlStyles.DoubleBuffer, true);

            SetStyle(ControlStyles.UserPaint, true);

            SetStyle(ControlStyles.ResizeRedraw, true);

            SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除配景.

#endif

            var videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            videoSource = new VideoCaptureDevice(videoDevices[1].MonikerString);

            videoSource.NewFrame += _videoSource_NewFrame;

            videoSource.Start();

        }

 

        protected override void OnPaint(PaintEventArgs e)

        {

            base.OnPaint(e);

 

#if GDIPlus

            if (frame != null)

            {

                e.Graphics.DrawImage(frame, ClientRectangle);

            }

#else

 

#endif

        }

 

        public enum TernaryRasterOperations : uint

        {

            SRCCOPY = 0x00CC0020,

            SRCPAINT = 0x00EE0086,

            SRCAND = 0x008800C6,

            SRCINVERT = 0x00660046,

            SRCERASE = 0x00440328,

            NOTSRCCOPY = 0x00330008,

            NOTSRCERASE = 0x001100A6,

            MERGECOPY = 0x00C000CA,

            MERGEPAINT = 0x00BB0226,

            PATCOPY = 0x00F00021,

            PATPAINT = 0x00FB0A09,

            PATINVERT = 0x005A0049,

            DSTINVERT = 0x00550009,

            BLACKNESS = 0x00000042,

            WHITENESS = 0x00FF0062,

            CAPTUREBLT = 0x40000000 //only if WinVer >= 5.0.0 (see wingdi.h)

        }

 

        Bitmap frame;

        private const int SRCCOPY = 0xCC0020;

 

        void _videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)

        {

             frame = (Bitmap)eventArgs.Frame.Clone();

 

#if GDIPlus

            Invalidate();

#else

             Bitmap sourceBitmap = frame;

             Graphics sourceGraphics = Graphics.FromImage(frame);

 

             Graphics destGraphics = CreateGraphics();

 

 

             IntPtr destDC = destGraphics.GetHdc();

             IntPtr destCDC = CreateCompatibleDC(destDC);

             IntPtr oldDest = SelectObject(destCDC, IntPtr.Zero);

 

             IntPtr sourceDC = sourceGraphics.GetHdc();

             IntPtr sourceCDC = CreateCompatibleDC(sourceDC);

             IntPtr sourceHB = sourceBitmap.GetHbitmap();

             IntPtr oldSource = SelectObject(sourceCDC, sourceHB);