用字节数组填充picxturebox会产生奇怪的效果

时间:2018-05-19 18:25:58

标签: c# arrays

我正在用c#编写并使用它来填充我的PictureBox字节数组

var bmp = new Bitmap(48, 32, PixelFormat.Format1bppIndexed);
var bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
                           ImageLockMode.WriteOnly, bmp.PixelFormat);

Marshal.Copy(fileArray, 0, bmpData.Scan0, fileArray.Length);
bmp.UnlockBits(bmpData);

return bmp;

结果很奇怪。

它只填充第125个字节。所以我尝试使用数据并且0-125字节显示它们应该显示但是在字节125之后的任何内容都没有显示并且它覆盖了字节125.

所以,如果我做0-125全部0xff,我会得到最好的结果。但是将{126}作为0x00添加,它将0x00替换为125。

2 个答案:

答案 0 :(得分:0)

这个解决方案对我有用。它到目前为止并不是最好的,并且显示缺乏理解或仅仅是位图不能支持每像素单色1位图像。从来没有这样做。所有这一切都是在每个6字节的行上增加2个字节。因此,步幅可以处理它。

int j = 1;
int k = 0;
for (int i = 0; i < 192; i++)
{
    fixArray[k] = blob[i];
    j++;
    if (j == 7)
    {
        j = 1;
        fixArray[++k] = 0;
        fixArray[++k] = 0;
    }
    k++;
}

答案 1 :(得分:0)

您可以逐行移动数据,而不是将填充插入数据中:

int w = 48;
int h = 32;
int unpadded = w / 8;   // unpadded byte length of one line in your data

Bitmap bmp = new Bitmap(w, h,  PixelFormat.Format1bppIndexed);
BitmapData bmpData = bmp.LockBits(
                        new Rectangle(0, 0, bmp.Width, bmp.Height),
                        ImageLockMode.WriteOnly, bmp.PixelFormat);

int stride = 8 // padded length of scanline

for (int i = 0; i < h; i++)
{
    Marshal.Copy(blob, i * unpadded , bmpData.Scan0 + i * stride, unpadded );  
}
bmp.UnlockBits(bmpData);
return bmp;

请注意,为了使位图操作更快,所有物理行的长度必须是4个字节的倍数。得到的填充长度称为stride

  

步幅是单行像素(扫描线)的宽度,   四舍五入到四字节边界。如果步幅是积极的,那么   位图是自上而下的。如果步幅为负,则位图为   自下而上。

逻辑长度为48像素且1bpp,逻辑长度为6个字节,因此必须在内部填充为8个字节。

最好不要在托管代码中移动数据以准备此操作,而只是将正确的部分移动到正确的插槽中。

以下是更多examples of calculating stride for other formats