【问题标题】:displaying OPOS barcode scanner image byte array显示 OPOS 条码扫描仪图像字节数组
【发布时间】:2019-05-11 12:46:33
【问题描述】:

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

还有一种跨步的替代方式:

Bitmap im = new Bitmap(752, 480, -752,
                     PixelFormat.Format8bppIndexed,
                     Marshal.UnsafeAddrOfPinnedArrayElement(scannedByteArray, 0));

而我得到的图像不好或颜色错误。

我尝试了很多解决方案(如下所示),但都没有帮助

第一个:Byte Array to Image Conversion

第二个:How to convert image to byte array(在这里我试图做相反的解决方案,但没有奏效) 我已经在这个问题上花了 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

【问题讨论】:

  • 这段代码有什么异常? MemoryStream ms = new MemoryStream(scannedByteArray); pictureBox1.Image = Image.FromStream(ms);这似乎是正确的解决方案。
  • 这就是重点,所有解决方案似乎都是正确的。但我总是出错。在这里我得到“参数无效”异常。 @farbiondriven
  • 据我所知,GDI+ 不支持 16 位灰度图像。 System.Windows.Media 确实如此 (PixelFormats.Gray16)。可以使用JpegBitmapDecoder 将其转换为BitmapSource(或System.Drawing.Bitmap)。您也可以尝试使用Format16bppGrayScale 格式将其转换为GDI+ 位图,但我不确定它是否正确。如果您可以共享字节数组(原始/二进制格式...)
  • 我尝试了Format16bppGrayScale,但也没有成功。图像在图片框中显示为大红色“X”。我将尝试解码器并用我将得到的结果更新问题。 @吉米
  • 该文件是部分 JFIF (jpeg) 文件。标头已修改:文件格式签名是部分的(前 3 个字节已更改)。文件终止签名丢失。内部表已被剥离/修改。看来是故意的。通常的做法是生成标准文件格式,然后篡改生成的文件以获得专有 格式。当然它也可能被破坏。我对此表示怀疑,但我只看到了一个 sample 所以...

标签: c# .net image image-processing pos


【解决方案1】:

你可以试试这个吗?

pictureBox1.Image = Image x = (Bitmap)((new ImageConverter()).ConvertFrom(scannedByteArray));

【讨论】:

  • 同样的异常,“参数无效”。
  • ImageConverter 只是在内部使用Image.FromStream,所以这没有用。
猜你喜欢
  • 2019-08-06
  • 2011-12-25
  • 2012-10-08
  • 2023-03-08
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多