如何将字节指针转换为VB.Net [英] How to Convert Byte Pointer to VB.Net

查看:91
本文介绍了如何将字节指针转换为VB.Net的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

*我认为VB.Net不支持Pointer。

有人请告诉我其他任何方式。

* I think VB.Net is not support Pointer.
Someone please tell me any other way then.

private void contrast_function()
       {
           double nContrast = 30;
           double pixel = 0, contrast = (100.0 + nContrast) / 100.0;
           contrast *= contrast;
           int red, green, blue;
           Bitmap b = new Bitmap(pictureBox1.Image);
                     BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
           int stride = bmData.Stride;
           System.IntPtr Scan0 = bmData.Scan0;
           unsafe
           {
               byte* p = (byte*)(void*)Scan0;
               int nOffset = stride - b.Width * 3;
               for (int y = 0; y < b.Height; ++y)
               {
                   for (int x = 0; x < b.Width; ++x)
                   {
                       blue = p[0];
                       green = p[1];
                       red = p[2];
                       pixel = red / 255.0;
                       pixel -= 0.5;
                       pixel *= contrast;
                       pixel += 0.5;
                       pixel *= 255;
                       if (pixel < 0) pixel = 0;
                       if (pixel > 255) pixel = 255;
                       p[2] = (byte)pixel;
                       pixel = green / 255.0;
                       pixel -= 0.5;
                       pixel *= contrast;
                       pixel += 0.5;
                       pixel *= 255;
                       if (pixel < 0) pixel = 0;
                       if (pixel > 255) pixel = 255;
                       p[1] = (byte)pixel;
                       pixel = blue / 255.0;
                       pixel -= 0.5;
                       pixel *= contrast;
                       pixel += 0.5;
                       pixel *= 255;
                       if (pixel < 0) pixel = 0;
                       if (pixel > 255) pixel = 255;
                       p[0] = (byte)pixel;
                       p += 3;
                   }
                   p += nOffset;
               }
           }
           b.UnlockBits(bmData);
           pictureBox1.Image = (Image)b;
       }

推荐答案

OBS! '指针(Of xxx)无效。你必须做类似的事情:



OBS! 'Pointer(Of xxx) is invalid. You've got to do something like:

Private Sub contrast_function()
      Dim nContrast As Double = 30
      Dim pixel As Double = 0, contrast As Double = (100.0 + nContrast) / 100.0
      contrast *= contrast
      Dim red As Integer, green As Integer, blue As Integer
      Dim b As New Bitmap( pictureBox1.Image)
      Dim bmData As BitmapData = b.LockBits(New Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
      Dim stride As Integer = bmData.Stride
      Dim Scan0 As System.IntPtr = bmData.Scan0
      Dim buffer(stride * bmData.Height - 1) As Byte
      Dim p = Marshal.UnsafeAddrOfPinnedArrayElement(buffer, 0)
      p = Scan0 'Pointer(Of Byte) = CType(CType(Scan0, Pointer(Of System.Void)), Pointer(Of Byte))
      Dim nOffset As Integer = stride - b.Width * 3
      Dim offSet = 0
      For y As Integer = 0 To b.Height - 1
          For x As Integer = 0 To b.Width - 1
              blue = buffer(0 + offSet)
              green = buffer(1 + offSet)
              red = buffer(2 + offSet)
              pixel = red / 255.0
              pixel -= 0.5
              pixel *= contrast
              pixel += 0.5
              pixel *= 255
              If pixel < 0 Then
                  pixel = 0
              End If
              If pixel > 255 Then
                  pixel = 255
              End If
              buffer(2 + offSet) = CByte(Math.Truncate(pixel))
              pixel = green / 255.0
              pixel -= 0.5
              pixel *= contrast
              pixel += 0.5
              pixel *= 255
              If pixel < 0 Then
                  pixel = 0
              End If
              If pixel > 255 Then
                  pixel = 255
              End If
              buffer(1 + offSet) = CByte(Math.Truncate(pixel))
              pixel = blue / 255.0
              pixel -= 0.5
              pixel *= contrast
              pixel += 0.5
              pixel *= 255
              If pixel < 0 Then
                  pixel = 0
              End If
              If pixel > 255 Then
                  pixel = 255
              End If
              buffer(0) = CByte(Math.Truncate(pixel))
              offSet += 3
          Next
          offSet += nOffset
      Next
      b.UnlockBits(bmData)
       pictureBox1.Image = DirectCast(b, Image)
  End Sub


Private Sub contrast_function()
    Dim nContrast As Double = 30
    Dim pixel As Double = 0, contrast As Double = (100.0 + nContrast) / 100.0
    contrast *= contrast
    Dim red As Integer, green As Integer, blue As Integer
    Dim b As New Bitmap(pictureBox1.Image)
    Dim bmData As BitmapData = b.LockBits(New Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)
    Dim stride As Integer = bmData.Stride
    Dim Scan0 As System.IntPtr = bmData.Scan0
    Dim p As Pointer(Of Byte) = CType(CType(Scan0, Pointer(Of System.Void)), Pointer(Of Byte))
    Dim nOffset As Integer = stride - b.Width * 3
    For y As Integer = 0 To b.Height - 1
        For x As Integer = 0 To b.Width - 1
            blue = p(0)
            green = p(1)
            red = p(2)
            pixel = red / 255.0
            pixel -= 0.5
            pixel *= contrast
            pixel += 0.5
            pixel *= 255
            If pixel < 0 Then
                pixel = 0
            End If
            If pixel > 255 Then
                pixel = 255
            End If
            p(2) = CByte(Math.Truncate(pixel))
            pixel = green / 255.0
            pixel -= 0.5
            pixel *= contrast
            pixel += 0.5
            pixel *= 255
            If pixel < 0 Then
                pixel = 0
            End If
            If pixel > 255 Then
                pixel = 255
            End If
            p(1) = CByte(Math.Truncate(pixel))
            pixel = blue / 255.0
            pixel -= 0.5
            pixel *= contrast
            pixel += 0.5
            pixel *= 255
            If pixel < 0 Then
                pixel = 0
            End If
            If pixel > 255 Then
                pixel = 255
            End If
            p(0) = CByte(Math.Truncate(pixel))
            p += 3
        Next
        p += nOffset
    Next
    b.UnlockBits(bmData)
    pictureBox1.Image = DirectCast(b, Image)
End Sub


这篇关于如何将字节指针转换为VB.Net的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆