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

  • 相关阅读:
    Java基础——clone()方法浅析
    Unity shader error: “Too many texture interpolators would be used for ForwardBase pass”
    ar 解压一个.a文件报错: xxx.a is a fat file (use libtool(1) or lipo(1) and ar(1) on it)
    How to set up "lldb_codesign" certificate!
    Unity-iPhone has Conflicting Provisioning Settings
    ETC1/DXT1 compressed textures are not supported when publishing to iPhone
    Xcode 提交APP时遇到 “has one iOS Distribution certificate but its private key is not installed”
    XCode iOS之应用程序标题本地化
    苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置
    Unity 4.7 导出工程在XCode10.1上编译报错
  • 原文地址:https://www.cnblogs.com/xiaowy/p/4004299.html
Copyright © 2011-2022 走看看