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

    使用bitblt比DrawImage有更好的性能,实际使用中,毛边现象比较严重。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    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
            );
        }
    }
  • 相关阅读:
    Angular 从入坑到挖坑
    如何获取 C# 类中发生数据变化的属性信息
    我的领域驱动设计运用实例
    Newbe.Claptrap
    体验 QQ机器人C# SDK 1.X 特性总结
    Newbe.Claptrap 框架中为什么用 Claptrap 和 Minion 两个词?
    轻松应对并发问题 Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车
    谈反应式编程在服务端中的应用,数据库操作优化,提速 Upsert
    十万同时在线用户,需要多少内存?——Newbe.Claptrap 框架水平扩展实验
    docker-mcr 助您全速下载 dotnet 镜像
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8365241.html
Copyright © 2011-2022 走看看