Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net >单行像素数据的宽度(以字节为单位)。该宽度是图像像素尺寸的倍数,或者可能是次倍数,并且可以填充以包含更多的字节_.net_Vb.net_Pixels - Fatal编程技术网

.net >单行像素数据的宽度(以字节为单位)。该宽度是图像像素尺寸的倍数,或者可能是次倍数,并且可以填充以包含更多的字节

.net >单行像素数据的宽度(以字节为单位)。该宽度是图像像素尺寸的倍数,或者可能是次倍数,并且可以填充以包含更多的字节,.net,vb.net,pixels,.net,Vb.net,Pixels,PixelFormat数据的实际像素格式。这对于找到正确的字节很重要 宽度锁定图像的宽度 高度锁定图像的高度 Scan0和Stride与内存中数组的关系如下所示: 如图所示,Stride属性保存一行的宽度(以字节为单位)。然而,行的大小可能不是像素大小的精确倍数,因为为了提高效率,系统确保将数据打包到从四字节边界开始并填充到四字节倍数的行中。这意味着,例如,17像素宽的24位每像素图像的跨距为52。每行中使用的数据将占用3*17=51字节,1字节的填充将每行扩展到52字节或13*4字节。17像

PixelFormat数据的实际像素格式。这对于找到正确的字节很重要

宽度锁定图像的宽度

高度锁定图像的高度

Scan0Stride与内存中数组的关系如下所示:

如图所示,Stride属性保存一行的宽度(以字节为单位)。然而,行的大小可能不是像素大小的精确倍数,因为为了提高效率,系统确保将数据打包到从四字节边界开始并填充到四字节倍数的行中。这意味着,例如,17像素宽的24位每像素图像的跨距为52。每行中使用的数据将占用3*17=51字节,1字节的填充将每行扩展到52字节或13*4字节。17像素宽的4BppIndexed图像的步幅为12。其中九个字节,或者更准确地说是八个半字节,将包含数据,并且该行将用另外3个字节填充到4个字节的边界

如上所述,行的数据承载部分根据像素格式布置。包含RGB数据的每像素24位图像将每3个字节有一个新像素,每像素32位RGBA每4个字节有一个新像素。必须仔细处理每字节包含多个像素的像素格式,例如每像素索引4位和每像素索引1位,以便所需像素不会与同一字节中的相邻像素混淆

查找正确的字节。

因为步幅是一行的宽度,所以要索引任何给定的行或Y坐标,可以将步幅乘以Y坐标以获得特定行的开头。在行中查找正确的像素可能更困难,这取决于了解像素格式的布局。以下示例显示如何访问给定像素格式的特定像素

Format32BppArgb给定X和Y坐标,像素中第一个元素的地址是Scan0+(Y*stride)+(X*4)。这指向蓝色字节。以下三个字节包含绿色、红色和alpha字节

Format24BppRgb给定X和Y坐标,像素中第一个元素的地址为Scan0+(Y*Stride)+(X*3)。这指向蓝色字节,后跟绿色和红色

格式化8bpindexed给定X和Y坐标,字节地址为Scan0+(Y*Stride)+X。该字节是图像调色板的索引

Format4BppIndexed给定X和Y坐标,包含像素数据的字节计算为Scan0+(Y*Stride)+(X/2)。对应的字节包含两个像素,上半字节是两个像素中最左边的,下半字节是最右边的。上半字节和下半字节的四位用于从16色调色板中选择颜色

format1bpindexed给定X和Y坐标,包含像素的字节由Scan0+(Y*Stride)+(X/8)计算。字节包含8位,每一位是一个像素,最左边的像素在第8位,最右边的像素在第0位。位从双输入调色板中选择

对于每个像素有一个或多个字节的像素格式,公式很简单,可以通过按顺序循环所有Y和X值来实现。以下代码将每像素32位图像的蓝色分量设置为255。在这两种情况下,bm都是先前创建的位图。在c#中,将使用
不安全
块中的指针:

  BitmapData bmd=bm.LockBits(new Rectangle(0, 0, 10, 10), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat);
  int PixelSize=4;

  for(int y=0; y<bmd.Height; y++)
  {
    byte* row=(byte *)bmd.Scan0+(y*bmd.Stride);
    for(int x=0; x<bmd.Width; x++)
    {
      row[x*PixelSize]=255;
    }
  }
*鲍勃·鲍威尔的代码和文章,摘自

  BitmapData bmd=bm.LockBits(new Rectangle(0, 0, 10, 10), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat);
  int PixelSize=4;

  for(int y=0; y<bmd.Height; y++)
  {
    byte* row=(byte *)bmd.Scan0+(y*bmd.Stride);
    for(int x=0; x<bmd.Width; x++)
    {
      row[x*PixelSize]=255;
    }
  }
  Dim x As Integer
  Dim y As Integer
  Dim PixelSize As Integer = 4
  Dim bmd As BitmapData = bm.LockBits(new Rectangle(0, 0, 10, 10), System.Drawing.Imaging.ImageLockMode.ReadOnly, bm.PixelFormat)

  For y = 0 To bmd.Height - 1
    For x = 0 To bmd.Width - 1
      Marshal.WriteByte(bmd.Scan0, (bmd.Stride * y) + (4 * x) , 255)
    Next
  Next