首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

VB.net 影像撷取像素RGB速度的有关问题

2013-01-11 
VB.net 影像撷取像素RGB速度的问题小弟写了一支用picture控键去撷取像素RGB的程序并将RGB三原色的数值存入

VB.net 影像撷取像素RGB速度的问题
小弟写了一支用picture控键去撷取像素RGB的程序
并将RGB三原色的数值存入数据库

不过速度很慢 我是使用GetPixel函数

以下是我的代码:


    Dim 取几张图了 = (From 图像数据表 In 颜色数据表.图像数据表 Order By 图像数据表.图像张数 Descending Select 图像数据表).FirstOrDefault
        Dim 要插入的图数

        If 取几张图了 Is Nothing Then
            要插入的图数 = 1
        Else
            要插入的图数 = 取几张图了.图像张数 + 1
        End If
        '-----------------------------
        Dim 图像数据表1 As New 图像数据表
        Dim bmpImg As New Bitmap(pic.Image)

        For x坐标 = 0 To pic.Width - 1
            For y坐标 = 0 To pic.Height - 1
                鼠标.坐标点的RGB = bmpImg.GetPixel(x坐标, y坐标)
                图像数据表1.图像张数 = 要插入的图数
                图像数据表1.X坐标 = x坐标
                图像数据表1.Y坐标 = y坐标
                图像数据表1.R = 鼠标.坐标点的RGB.R
                图像数据表1.G = 鼠标.坐标点的RGB.G
                图像数据表1.B = 鼠标.坐标点的RGB.B

                颜色数据表.图像数据表.AddObject(图像数据表1)
                颜色数据表.SaveChanges(System.Data.Objects.SaveOptions.None)


            Next
        Next




所以我在goole上搜索有无比GetPixel函数去撷取像素RGB
更快的方法 我找到了以下这个


快速绘图模块:
http://ycc.tsu.edu.tw/ImgProc/FastPixelModule.htm

它的模块在处理速度上可以快上十倍  可是我拿来用速度根本没变快

我将这个模块 这个部分改成:


  '在内存锁定状态下取得颜色点(Pixel)
    Function GetP(ByVal i As Integer, ByVal j As Integer) As Color
        Dim k As Integer = j * L + i * Bpx '索引位置计算
        Dim C As Color = Color.FromArgb(rgb(k + 3), rgb(k + 2), rgb(k + 1), rgb(k))
        Return C
    End Function



然后使用它的模块去更改我的代码:


Dim 取几张图了 = (From 图像数据表 In 颜色数据表.图像数据表 Order By 图像数据表.图像张数 Descending Select 图像数据表).FirstOrDefault
        Dim 要插入的图数



        If 取几张图了 Is Nothing Then
            要插入的图数 = 1
        Else
            要插入的图数 = 取几张图了.图像张数 + 1
        End If


        '-----------------------------
        Dim bmpImg As New Bitmap(pic.Image)
        Dim 图像数据表1 As New 图像数据表


        'Dim bmpImg As New Bitmap(区块x坐标, 区块y坐标)
        'Dim R(pic.Width - 1, pic.Height - 1) As Byte, G(pic.Width - 1, pic.Height - 1) As Byte, B(pic.Width - 1, pic.Height - 1) As Byte

        FastPixel.LockBMP(bmpImg)
        For x坐标 = 0 To pic.Width - 1
            For y坐标 = 0 To pic.Height - 1
                图像数据表1.图像张数 = 要插入的图数
                图像数据表1.X坐标 = x坐标
                图像数据表1.Y坐标 = y坐标


                图像数据表1.R = FastPixel.GetP(x坐标, y坐标).R
                图像数据表1.G = FastPixel.GetP(x坐标, y坐标).G
                图像数据表1.B = FastPixel.GetP(x坐标, y坐标).B

                ' 图像数据表1.R = BitConverter.ToInt32(R(x坐标, y坐标), 0)

                颜色数据表.图像数据表.AddObject(图像数据表1)
                颜色数据表.SaveChanges(System.Data.Objects.SaveOptions.None)
            Next
        Next
        FastPixel.UnLockBMP(bmpImg)



不过这个方法基本上速度跟GetPixl函数是一样的根本没变 请问这个模块到底要怎么用才能达到我的需求呢?
[解决办法]
直接将bitmap存入内存,然后以访问数组的方式去读取。不过要注意不同调色板,格式不同。最好找找有没有这样的库。

热点排行