C# 从字节数组创建位图
我有一个扫描仪,可以提供灰度8位图像。我的目标是将这个图像转换成单色,我已经实现了。要转换,我需要对位图对象进行操作,而不仅仅是字节数组。我从字节数组获取位图的代码如下所示:C# 从字节数组创建位图,c#,image-processing,bitmap,C#,Image Processing,Bitmap,我有一个扫描仪,可以提供灰度8位图像。我的目标是将这个图像转换成单色,我已经实现了。要转换,我需要对位图对象进行操作,而不仅仅是字节数组。我从字节数组获取位图的代码如下所示: public static Bitmap ByteArrayToBitmap(byte[] data, int width, int height) { Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed); Bitm
public static Bitmap ByteArrayToBitmap(byte[] data, int width, int height)
{
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
Marshal.Copy(data, 0, bmpData.Scan0, data.Length);
bmp.UnlockBits(bmpData);
bmp.Save(@"C:\Type7Test\TestImage.bmp", ImageFormat.Bmp);
return bmp;
}
我的问题是,从这一点上看,位图的格式是错误的。注意我将位图保存到磁盘的那一行(仅用于测试),结果如下:
正如您所看到的,这不是预期的图像。我预计结果是:
我怀疑
像素格式和位图的创建有问题那么,有人能给我指出正确的方向,从一系列原始图像数据创建一个正确的位图吗?仔细考虑后,你确定PixelFormat.format8bpindexed
是正确的格式吗?创建位图后,它或多或少看起来像所需的图像。这表明你为一张图片提供了太多或太少的数据,这意味着你的像素格式可能是错误的
您可以尝试使用不同的类型进行试验,并检查哪种类型有效。他们很谨慎,这取决于图像的颜色(颜色越多,所需的每像素比特率越大)。这看起来很相似-预期输出的宽度是结果的两倍,例如在徽标处。从何处获取宽度+高度值?您是否尝试过格式化4bppindexed
?扫描仪输出是否存储在文件中?对于原始像素数据,您需要知道其格式。或者可能是数据已格式化且未定义
或DontCare
可以吗??(只是猜测)@TaW我试过使用DontCare和Undefined,但它不起作用。宽度和高度值存储在调用此方法的对象中。需要指出的是,DPI的大小是固定的300。只是检查一下,但是您确定data
数组中的数据填充/处理正确吗?通过更改for
循环中的参数,可以轻松地“偏移”图像。我假设您迭代一维(通常是高度),并使用偏移访问像素的每个颜色分量。该图像看起来太“数学变形”,不可能是“保存到磁盘”相关问题。DPI可能与此无关。我将使用十六进制编辑器查看这些字节值,并尝试确定它们的格式。再一次:宽度+高度值起源于何处?是你告诉扫描仪的吗?该标志的直径约为133px,但在您的结果中约为200px。这听起来像是将2字节解释为3字节,就像使用24位格式而不是16位格式。但那不是你告诉我们的。。总尺寸是多少?大的黄色条纹也很奇怪;也没有什么东西看起来像彩色桌子。请随时通知我们