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