1

我正在使用带有 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

4

1 回答 1

0

你能试试这个吗?

pictureBox1.Image = Image x = (Bitmap)((new ImageConverter()).ConvertFrom(scannedByteArray));
于 2018-12-10T17:02:59.053 回答