vb.net读取picturebox所有像素

uuicczxl 2009-12-09 07:24:14

vb6 可以用 getbits 速度还可以

vb.net 用什么方法读取所有像素速度快呢
...全文
500 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
清晨曦月 2009-12-10
  • 打赏
  • 举报
回复
不过也有点问题,这里边总有个大范围寻址的问题。不知道哪位高人有更好的方法。但相对来讲还是后面的方法更快一些,有兴趣可以查看BitMap.GetPixel方法的源码,呵呵。另外带A通道的处理和这个稍有差异。
清晨曦月 2009-12-10
  • 打赏
  • 举报
回复
Public Class Form1
Dim bmp As Bitmap
Dim WithEvents but As Button
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
but = New Button
Me.Controls.Add(but)
but.Location = Me.ClientSize - but.Size
bmp = Bitmap.FromFile("C:\Documents and Settings\zcsor\My Documents\My Pictures\远古.jpg")
Me.BackgroundImage = bmp
End Sub

Private Sub but_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles but.Click
'下面是用了GetPixel方法,如果图片比较大,那么应该用下面的LockBits方法。
Dim x As Integer = 0, y As Integer = 0
Debug.Print(Hex(bmp.GetPixel(x, y).ToArgb).PadLeft(8, "0") & " --- " & bmp.GetPixel(x, y).ToString)
x = 1
Debug.Print(Hex(bmp.GetPixel(x, y).ToArgb).PadLeft(8, "0") & " --- " & bmp.GetPixel(x, y).ToString)
x = 2
Debug.Print(Hex(bmp.GetPixel(x, y).ToArgb).PadLeft(8, "0") & " --- " & bmp.GetPixel(x, y).ToString)
'下面使用LockBits方法,一次性获取了全部数据,所以图片比较大的时候速度会明显更快一些。
Dim b As Drawing.Imaging.BitmapData = bmp.LockBits(Rectangle.Truncate(bmp.GetBounds(GraphicsUnit.Pixel)), Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat)
Dim ptr As IntPtr = b.Scan0
Dim bytes As Integer = b.Stride * bmp.Height
Dim rgbValues(bytes - 1) As Byte
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
bmp.UnlockBits(b)
Debug.Print("b:" & rgbValues(0) & " " & "g:" & rgbValues(1) & " " & "r:" & rgbValues(2))
Debug.Print("b:" & rgbValues(3) & " " & "g:" & rgbValues(4) & " " & "r:" & rgbValues(5))
Debug.Print("b:" & rgbValues(6) & " " & "g:" & rgbValues(7) & " " & "r:" & rgbValues(8))
End Sub

End Class
uuicczxl 2009-12-09
  • 打赏
  • 举报
回复
来人啊
lang_csdn 2009-12-09
  • 打赏
  • 举报
回复
Partial Public Class NativeMethods

'''Return Type: COLORREF->DWORD->unsigned int
'''hdc: HDC->HDC__*
'''x: int
'''y: int
<System.Runtime.InteropServices.DllImportAttribute("gdi32.dll", EntryPoint:="GetPixel")> _
Public Shared Function GetPixel(<System.Runtime.InteropServices.InAttribute()> ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer) As UInteger
End Function


<System.Runtime.InteropServices.DllImportAttribute("user32.dll", EntryPoint:="GetDC")> _
Public Shared Function GetDC(<System.Runtime.InteropServices.InAttribute()> ByVal hWnd As System.IntPtr) As System.IntPtr
End Function
End Class




Dim b As New System.Drawing.Bitmap("c:\1.jpg")
Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(b)
Dim hdc As IntPtr = g.GetHdc


For x As Integer = 0 To 10
For y As Integer = 0 To 20
Debug.WriteLine(".NET" & b.GetPixel(x, y).ToArgb & " API: " & NativeMethods.GetPixel(hdc.ToInt32, x, y))
Next
Next


不过,我发现api的值,不能读取,可能是hdc的问题!准备吃饭了,希望高手帮我改一下!
uuicczxl 2009-12-09
  • 打赏
  • 举报
回复
没这么难吧。。。
laviewpbt 2009-12-09
  • 打赏
  • 举报
回复
http://blog.csdn.net/laviewpbt/category/255592.aspx?PageNumber=2

vb.net中彩色图像数据的快速获取
uuicczxl 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lang_csdn 的回复:]
引用 5 楼 uuicczxl 的回复:
.net 能用getpixel 还说什么了


.net 也可以使用getpixel  api的



[/Quote]


怎么用啊
laviewpbt 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
Bitmap.GetPixel
[/Quote]

钻石给出这样的答案让我对CSDN的这种等级制度表示强烈的怀疑。

VB.NET中可以用LockBits
lang_csdn 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 uuicczxl 的回复:]
.net 能用getpixel 还说什么了
[/Quote]

.net 也可以使用getpixel api的


uuicczxl 2009-12-09
  • 打赏
  • 举报
回复
.net 能用getpixel 还说什么了
lang_csdn 2009-12-09
  • 打赏
  • 举报
回复
对这方面没有什么研究,是不是根据x,y轴,循环使用GetPixel读取吧!


yifan__ 2009-12-09
  • 打赏
  • 举报
回复
顶一个,我也想知道额
uuicczxl 2009-12-09
  • 打赏
  • 举报
回复
详细点好吗 给分
wuyq11 2009-12-09
  • 打赏
  • 举报
回复
Bitmap.GetPixel

16,555

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧