首页后端开发ASP.NETvb点虐图像处理 vb做图像处理

vb点虐图像处理 vb做图像处理

时间2023-04-15 23:00:02发布访客分类ASP.NET浏览1201
导读:Vb点虐怎么实现图像的处理 这问题有点笼统,软糖来说说把:图像处理由System.Drawing命名空间负责。主要是Bitmap类和Graphics类。Bitmap表示一个位图,可以是BMP,JPG,PNG等文件。装载位图Dim 位图 As...

Vb点虐怎么实现图像的处理

这问题有点笼统,软糖来说说把:

图像处理由System.Drawing命名空间负责。

主要是Bitmap类和Graphics类。

Bitmap表示一个位图,可以是BMP,JPG,PNG等文件。

装载位图

Dim 位图 As Bitmap = Bitmap.FromFile("C:\Image1.PNG")

Graphics表示一张画纸,能够进行绘制操作。

它可以被窗体、控件、位图调用CreateGraphics()方法来创建。

然后调用Graphics.Draw开头的一系列函数来绘制图像和图形,Fill开头的填充图形。

创建画纸并绘制位图

Dim 画纸 As Graphics = Me.CreateGraphics()

画纸.DrawImage(位图, 100, 100, 256, 256)

可以将上面三行放到Form1_Load中测试,把路径改一下,

还可以把Me改为能在上面绘图的控件的名称。

更多内容请看MSDN的System.Drawing命名空间。

如满意,请采纳,谢谢。

在vb点虐环境下图像处理,用什么建立3D

首先,还是谈谈图像像素时数据获取方面吧,点虐中的图像相关类基本上都是基于GDI+的,因此,图像数据的获取其实也是调用GDI+的一些函数。这个函数就是LockBits,在vb点虐中彩色图像数据的快速获取 一文中,我们是调用了Marshal.Copy把LockBits锁定的内存数据拷贝到数据中,然后对数组中的值进行处理。这样做主要的原因是VB.NET不好直接访问内存(Marshal.ReadByte之类的函数不适合用于大型的循环中)。那么,这就造成了2个不好的事情,第一:在同一时间需要2倍于图像数据量的内存,第二:内存数据拷贝到数据,以及处理后再把数组的数据拷贝会内存中都是会减低速度的。作为一种改进,我们应该充分利用LockBits的功能。LockBits中的LockMode中有一种模式为ImageLockMode.UserInputBuffer,该模式下需要用户先申请内存,然后在把图像数据按照相关格式填充如这个内存中。这样,就可以先定义个数组,然后把图像数据填充到这个数组中,就避免了来回拷贝的耗时了,简单示例代码如下:

Dim BmpData As New BitmapData

Stride = ((Bmp.Width * 3 + 3) And HFFFFFFFC)

Dim PixleValue(Stride * Bmp.Height) As Byte

Dim Hanlde As GCHandle = GCHandle.Alloc(PixleValue, GCHandleType.Pinned)

BmpData.Scan0 = Hanlde.AddrOfPinnedObject()

VB点虐如何对picturebox1的图片进行高斯模糊?

Imports System

Imports System.Drawing

Imports System.Drawing.Imaging

Imports System.Runtime.InteropServices

''' summary

''' Summary description for TextShadow

''' /summary

''' remarks/remarks

Public Class gaoshiBLUR

    Public newbmp As Bitmap

    StructLayout(LayoutKind.Explicit) Structure rgbA

        FieldOffset(0) Public R As Byte

        FieldOffset(1) Public G As Byte

        FieldOffset(2) Public B As Byte

        FieldOffset(3) Public A As Byte

        FieldOffset(0) Public col As Integer

    End Structure

    Private m_radius As Integer = 5

    ''' summary

    ''' 高斯卷积矩阵

    ''' /summary

    ''' remarks/remarks

    Private gaussMatrix As Integer()

    ''' summary

    ''' 卷积核

    ''' /summary

    ''' remarks/remarks

    Private nuclear As Integer = 0

    ''' summary

    ''' 模糊半径

    ''' /summary

    ''' value/value

    ''' returns/returns

    ''' remarks/remarks

    Public Property Radius() As Integer

        Get

            Return m_radius

        End Get

        Set(ByVal Value As Integer)

            If (m_radius  Value) Then

                m_radius = Value

                MakeGaussMatrix()

            End If

        End Set

    End Property

    ''' summary

    ''' 高斯模糊

    ''' /summary

    ''' param name="bmp"要处理的图像/param

    ''' remarks/remarks

    Public Sub MaskShadow(ByVal bmp As Bitmap)

        If nuclear = 0 Then MakeGaussMatrix()

        Dim rt As Rectangle = New Rectangle(0, 0, bmp.Width, bmp.Height)

        ' 克隆临时位图,作为卷积源

        Dim tmp As Bitmap = bmp.Clone()

        Dim dest As BitmapData = bmp.LockBits(rt, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb)

        Dim source As BitmapData = tmp.LockBits(rt, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb)

        Debug.Print(Radius)

        Debug.Print(dest.Width.ToString)

        Debug.Print(nuclear)

        Dim Number As Integer = (bmp.Height * dest.Stride - 1) / 4   ' 图像数据元素的个数,注意点虐中数组下标是从0开始的

        Dim bmpdata(Number) As Integer

        Dim tmpdata(Number) As Integer

        Dim TMPrgb(Number) As rgbA '临时参考颜色

        Dim BMPrgb(Number) As rgbA '计算结果后的颜色

        'ReDim bmpdata(Number)

        'ReDim TMPrgb(Number)

        Marshal.Copy(source.Scan0, tmpdata, 0, Number)

        Dim i As Long

        Dim j As Long

        j = Number

        Dim w, h As Long

        Dim yi, xi As Long

        Dim iw, ih, iiw, iih, iii As Long

        Dim k As Long

        Dim nn As Integer = (Radius * 2 + 1) ^ 2

        Dim n As Integer = Radius * 2 + 1

        w = bmp.Width

        h = bmp.Height

        ' System.Array.Copy(TMPrgb, tmpdata, j)

        For i = 0 To j

            TMPrgb(i).col = tmpdata(i)

        Next i

        i = 0

 

        For i = 0 To j

          

            ih = Int(i / w)

            iw = i - ih * w

            Dim r As Double = 0

            Dim g As Double = 0

            Dim b As Double = 0

            Dim a As Double = 0

            Dim weight As Double

      

            For k = 0 To nn

                '需要解决的是周边遍历颜色值然后相加(r=r1*weight1+r2*weight2+r3*weight3+r4*weight4+r5*weight5+...r*weight)

                yi = Int(k / n)

                xi = k - yi * n

                yi -= Radius

                xi -= Radius

                iiw = iw + xi

                iih = ih + yi

                'yi = Int(k / n)

                'xi = k - yi * n

                'iih = ih + yi - Radius

                'iiw = iw + xi - Radius

                If (iiw  0 OrElse iih  0) Or (iiw  w - 1 OrElse iih  h - 1) Then

                    iiw = iw

                    iih = ih

                    iii = i

                Else

                    iii = iih * w

                    iii += iiw

                End If

                weight = gaussMatrix(k) / 1000

                r += TMPrgb(iii).R * weight

                g += TMPrgb(iii).G * weight

                b += TMPrgb(iii).B * weight

                a += TMPrgb(iii).A * weight

            Next

            'TMPrgb(i).col = tmpdata(i)

            'r = TMPrgb(i).R * weight

            'g = TMPrgb(i).G * weight

            'b = TMPrgb(i).B * weight

            BMPrgb(i).R = IIf(r  255, 255, r)

            BMPrgb(i).G = IIf(g  255, 255, g)

            BMPrgb(i).B = IIf(b  255, 255, b)

            BMPrgb(i).A = IIf(a  255, 255, a)

            bmpdata(i) = BMPrgb(i).col

            'Debug.Print(TMPrgb(i).R)

        Next

        Marshal.Copy(bmpdata, 0, dest.Scan0, Number)

        tmp.UnlockBits(source)

        bmp.UnlockBits(dest)

        newbmp = bmp.Clone

        tmp.Dispose()

        ' End Try

    End Sub

    ''' summary

    ''' 高斯卷积矩阵

    ''' /summary

    ''' remarks/remarks

    Protected Sub MakeGaussMatrix()

        Dim Q As Double = Radius / 2

        If (Q = 0.0) Then Q = 0.1

        Dim n As Integer = Radius * 2 + 1

        Dim index As Integer = 0

        nuclear = 0

        ReDim gaussMatrix(n * n)

        Dim x As Integer

        Dim y As Integer

        For x = -Radius To Radius

            For y = -Radius To Radius

                gaussMatrix(index) = Math.Round(Math.Exp(-((x * x + y * y)) / (2.0 * Q * Q)) / (2.0 * Math.PI * Q * Q) * 1000.0)

                nuclear += gaussMatrix(index)

                index += 1

            Next

        Next

    End Sub

End Class

使用方法.

Dim bmp As Bitmap = PictureBox1.Image.Clone

        Dim x As New gaoshiBLUR

        x.Radius = 30

        x.MaskShadow(bmp)

        PictureBox2.Image = x.newbmp.Clone

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: vb点虐图像处理 vb做图像处理
本文地址: https://pptw.com/jishu/3245.html
聊天列表代码java java聊天室代码 vb点虐文件拖拽 vba拖拽获取文件名

游客 回复需填写必要信息