这是VB.NET的代码,本该发到VB.NET区的,但觉得现在用C#的人比较多,所以发在这应该会更有人气些.以下有两段我的截屏代码,请教以下代码还能再做那些的优化使得截屏速度更快.
我知道我的测试结果是跟电脑的配置有关的,但我还是希望能在我这配置不怎么高的电脑里能够取得更快的执行速度.代码一:
Dim Tim As New Stopwatch
Tim.Start()
For i As Integer = 1 To 50
Dim g As Graphics
Dim bmp As New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
g = Graphics.FromImage(bmp)
g.CopyFromScreen(0, 0, 0, 0, New Size(bmp.Width, bmp.Height))
g.Dispose()
Dim Bytes() As Byte
Dim p As New Imaging.EncoderParameter(Imaging.Encoder.Quality, 20)
Dim ps As New Imaging.EncoderParameters(1)
ps.Param(0) = p
Using BmpStream As MemoryStream = New MemoryStream
bmp.Save(BmpStream, GetCodecInfo("image/jpeg"), ps)
Bytes = BmpStream.ToArray
End Using
Next
Tim.Stop()
Add("截图完毕,总用时:" & Tim.ElapsedMilliseconds & " 毫秒 平均: " & Tim.ElapsedMilliseconds \ 50)
这代码50次截屏的平均值是380左右.
代码二:
Dim Tim As New Stopwatch
Tim.Start()
For i As Integer = 1 To 50
Dim hDC, hMDC As Integer
Dim hBMP, hBMPOld As Integer
Dim sw, sh As Integer
hDC = GetDC(0)
hMDC = CreateCompatibleDC(hDC)
sw = Screen.PrimaryScreen.Bounds.Width
sh = Screen.PrimaryScreen.Bounds.Height
hBMP = CreateCompatibleBitmap(hDC, sw, sh)
hBMPOld = SelectObject(hMDC, hBMP)
BitBlt(hMDC, 0, 0, sw, sh, hDC, 0, 0, SRCCOPY)
hBMP = SelectObject(hMDC, hBMPOld)
Dim bmp As New Bitmap(Image.FromHbitmap(New IntPtr(hBMP)))
Dim ps As EncoderParameters
ps = New EncoderParameters(1)
Dim p As EncoderParameter
p = New EncoderParameter(Encoder.Quality, 30)
ps.Param(0) = p
Dim ms As New MemoryStream
bmp.Save(ms, GetCodecInfo("image/jpeg"), ps)
Dim Bytes() As Byte = ms.ToArray
DeleteDC(hDC)
DeleteDC(hMDC)
DeleteObject(hBMP)
Next
Tim.Stop()
Add("截图完毕,总用时:" & Tim.ElapsedMilliseconds & " 毫秒 平均: " & Tim.ElapsedMilliseconds \ 50)
代码二50次截屏的平均值是420毫秒左右.
请问以上二段代码还能否再提高截屏速度?????
我知道我的测试结果是跟电脑的配置有关的,但我还是希望能在我这配置不怎么高的电脑里能够取得更快的执行速度.代码一:
Dim Tim As New Stopwatch
Tim.Start()
For i As Integer = 1 To 50
Dim g As Graphics
Dim bmp As New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height)
g = Graphics.FromImage(bmp)
g.CopyFromScreen(0, 0, 0, 0, New Size(bmp.Width, bmp.Height))
g.Dispose()
Dim Bytes() As Byte
Dim p As New Imaging.EncoderParameter(Imaging.Encoder.Quality, 20)
Dim ps As New Imaging.EncoderParameters(1)
ps.Param(0) = p
Using BmpStream As MemoryStream = New MemoryStream
bmp.Save(BmpStream, GetCodecInfo("image/jpeg"), ps)
Bytes = BmpStream.ToArray
End Using
Next
Tim.Stop()
Add("截图完毕,总用时:" & Tim.ElapsedMilliseconds & " 毫秒 平均: " & Tim.ElapsedMilliseconds \ 50)
这代码50次截屏的平均值是380左右.
代码二:
Dim Tim As New Stopwatch
Tim.Start()
For i As Integer = 1 To 50
Dim hDC, hMDC As Integer
Dim hBMP, hBMPOld As Integer
Dim sw, sh As Integer
hDC = GetDC(0)
hMDC = CreateCompatibleDC(hDC)
sw = Screen.PrimaryScreen.Bounds.Width
sh = Screen.PrimaryScreen.Bounds.Height
hBMP = CreateCompatibleBitmap(hDC, sw, sh)
hBMPOld = SelectObject(hMDC, hBMP)
BitBlt(hMDC, 0, 0, sw, sh, hDC, 0, 0, SRCCOPY)
hBMP = SelectObject(hMDC, hBMPOld)
Dim bmp As New Bitmap(Image.FromHbitmap(New IntPtr(hBMP)))
Dim ps As EncoderParameters
ps = New EncoderParameters(1)
Dim p As EncoderParameter
p = New EncoderParameter(Encoder.Quality, 30)
ps.Param(0) = p
Dim ms As New MemoryStream
bmp.Save(ms, GetCodecInfo("image/jpeg"), ps)
Dim Bytes() As Byte = ms.ToArray
DeleteDC(hDC)
DeleteDC(hMDC)
DeleteObject(hBMP)
Next
Tim.Stop()
Add("截图完毕,总用时:" & Tim.ElapsedMilliseconds & " 毫秒 平均: " & Tim.ElapsedMilliseconds \ 50)
代码二50次截屏的平均值是420毫秒左右.
请问以上二段代码还能否再提高截屏速度?????
解决方案 »
- winform中如何让flash上面的控件透明后看到是flash而不是窗体!
- C# socket编程为什么打开侦听的时候,程序容易卡死,且程序收不到数据
- 端口如何定位程序 【100分】
- winform中如何取得ComboBox 的值
- 用户控件赋值问题
- 一个类似防火墙的东西,请大家指点一二
- 如何从SQL SERVER数据库中提取照片并显示出来??调试了一天了!!
- ********* ExecuteScalar 是Command的 ,那sqlAdapter1的是什么?
- 用什么方法 把控件停靠再窗替右侧??
- 关于encoding.getEncoding("gb2312").getstring(bytes),一句话的问题
- 做了个网络信息采集系统,请大家拍拍砖
- 如何获得视频的时间长度
Dim ps As New Imaging.EncoderParameters(1) 看了一下,这两行似乎可以放到循环外面截屏本身要想更快,可考虑调用API吧等下面的高手来
我的代码二就是调用API的,但速度还不如代码一.
可能是我的代码写得不好导致效率底下.