我正在使用带有 OPOS DirectIO 命令的条形码设备在模式之间切换。
问题是当我使用设备捕获图像时,我得到一个字节数组
(根据设备规格,我得到的图像是 JPG 格式的“752x480 GrayScale 256,16,2”),我找不到将其转换为(图像)的方法。
我试过下面的代码
MemoryStream ms = new MemoryStream(scannedByteArray);
pictureBox1.Image = Image.FromStream(ms);
但它没有用。总是抛出“参数无效”异常。
也试过这个:
byte[] buffer = scannedByteArray;
var bitmap = new Bitmap(752, 480, PixelFormat.Format24bppRgb);
var bitmap_data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
Marshal.Copy(buffer, 0, bitmap_data.Scan0, buffer.Length);
bitmap.UnlockBits(bitmap_data);
和 stride 的另一种方法:
Bitmap im = new Bitmap(752, 480, -752,
PixelFormat.Format8bppIndexed,
Marshal.UnsafeAddrOfPinnedArrayElement(scannedByteArray, 0));
而且我的图像不好或颜色错误的图像损坏。
我尝试了很多解决方案(如下所示),但没有一个有帮助
第一种:字节数组到图像的转换
第二:如何将图像转换为字节数组(在这里我试图做相反的解决方案,但没有奏效)我已经在这个问题上花了 3 天时间,但仍然不知道如何显示图像或保存它。
注1:字节数组大小是可变的(每次捕获图像时都不是固定的,我得到不同大小的字节数组)
注意 2:我尝试过像素格式为 24 位、16 位和 8 位,具有不同的步幅值,并且总是显示错误或损坏的图像。
更新:
我尝试使用 JpegBitmapDecoder 如下:
JpegBitmapDecoder decoder = new JpegBitmapDecoder(ms, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
BitmapSource bitmapsource = decoder.Frames[0];
Bitmap bitmap = new Bitmap(bitmapsource.PixelWidth, bitmapsource.PixelHeight);
Rectangle rec = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
BitmapData bitmapdata = bitmap.LockBits(rec, ImageLockMode.WriteOnly,
(bitmapsource.Format.BitsPerPixel == 24 ? System.Drawing.Imaging.PixelFormat.Format24bppRgb : System.Drawing.Imaging.PixelFormat.Format32bppArgb));
bitmapsource.CopyPixels(System.Windows.Int32Rect.Empty, bitmapdata.Scan0, bitmapdata.Height * bitmapdata.Stride, bitmapdata.Stride);
bitmap.UnlockBits(bitmapdata);
但是第一行出现错误“没有适合完成此操作的成像组件”,我确信我从设备接收到的字节没有损坏,因为设备在其演示上运行没有任何问题,并且其配置没有任何更改。
更新 2:
这是我在捕获图像时从设备获得的字节样本。
https://drive.google.com/file/d/1kBuLDMTe9snwin9voEJ7z6kr9QKizftf/view?usp=sharing