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
            );
        }
    }
  • 相关阅读:
    宁波工程学院2020新生校赛C
    宁波工程学院2020新生校赛B
    宁波工程学院2020新生校赛A -恭喜小梁成为了宝可梦训练家~(水题)
    POJ 1611
    牛客算法周周练11E
    牛客算法周周练11C
    牛客算法周周练11A
    CodeForces 1176C
    CodeForces 445B
    UVALive 3027
  • 原文地址:https://www.cnblogs.com/zhaogaojian/p/8365241.html
Copyright © 2011-2022 走看看