zoukankan      html  css  js  c++  java
  • 在c#中使用bitblt显示图片

    使用bitblt比DrawImage有更好的性能

    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);
    
                 int success = StretchBlt(destDC, 0, 0, Width, Height, sourceCDC, 0, 0, sourceBitmap.Width, sourceBitmap.Height, (int)TernaryRasterOperations.SRCCOPY);
    
                 SelectObject(destCDC, oldDest);
                 SelectObject(sourceCDC, oldSource);
    
                 DeleteObject(destCDC);
                 DeleteObject(sourceCDC);
                 DeleteObject(sourceHB);
    
                 destGraphics.ReleaseHdc();
                 sourceGraphics.ReleaseHdc();
    #endif
                eventArgs.Frame.Dispose();
            }
            [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
            public static extern IntPtr CreateCompatibleDC(IntPtr hdc);
            [System.Runtime.InteropServices.DllImport("gdi32.dll")]
            private static extern int BitBlt(
            IntPtr hdcDest,     // handle to destination DC (device context)
            int nXDest,         // x-coord of destination upper-left corner
            int nYDest,         // y-coord of destination upper-left corner
            int nWidth,         // width of destination rectangle
            int nHeight,        // height of destination rectangle
            IntPtr hdcSrc,      // handle to source DC
            int nXSrc,          // x-coordinate of source upper-left corner
            int nYSrc,          // y-coordinate of source upper-left corner
            System.Int32 dwRop  // raster operation code
            );
    
            [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
            public static extern IntPtr SelectObject(IntPtr hdc, IntPtr obj);
    
            [System.Runtime.InteropServices.DllImportAttribute("gdi32.dll")]
            public static extern void DeleteObject(IntPtr obj);
    
            [DllImport("gdi32", EntryPoint = "StretchBlt")]
            public static extern int StretchBlt(
                    IntPtr hdc,
                    int x,
                    int y,
                    int nWidth,
                    int nHeight,
                    IntPtr hSrcDC,
                    int xSrc,
                    int ySrc,
                    int nSrcWidth,
                    int nSrcHeight,
                    int dwRop
            );
        }
    }
    

    参考:experts-exchange.com

  • 相关阅读:
    POJ-1004-Finanical Management
    POJ-1003-hangover
    第一次写博客,想了很久要给自己留一个什么样的开始
    从exchange2010上面删除特定主题或特定时间的邮件
    STM32 一个定时器产生4路 独立调频率,占中比可调,脉冲个数可以统计。
    光电耦合
    STM32 定时器级联
    Eclipse 创建新的workspace
    一次提交,多文件上传
    Grid标签计算结果集中的合计行
  • 原文地址:https://www.cnblogs.com/xiaowy/p/4004299.html
Copyright © 2011-2022 走看看