我正在用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。
答案 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个字节。
最好不要在托管代码中移动数据以准备此操作,而只是将正确的部分移动到正确的插槽中。