1. 程式人生 > >在c#中使用bitblt顯示圖片

在c#中使用bitblt顯示圖片

dso key order dex 性能 tco ret += windows

使用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 ); } }

在c#中使用bitblt顯示圖片