Отображение байтового массива изображения сканера OPOS

Я использую устройство штрих-кода с командами OPOS DirectIO для переключения между режимами.

проблема заключается в том, когда я использую устройство для захвата изображения, я получаю массив байтов

(из технических характеристик устройства изображение, которое я получаю, - "752x480 GrayScale 256,16,2" в формате JPG), и я не смог найти способ преобразовать его в (изображение).

Я пробовал ниже код

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));

и я получал плохое изображение или искаженное изображение с неправильными цветами.

Я пробовал так много решений (как показано ниже), но ни одно из них не помогло

1-й: преобразование байтового массива в изображение

2-й: Как преобразовать изображение в байтовый массив (здесь я пытался сделать противоположное решение, и оно не сработало) Я потратил 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

1 ответ

Ты можешь попробовать это?

pictureBox1.Image = Image x = (Bitmap)((new ImageConverter()).ConvertFrom(scannedByteArray));
Другие вопросы по тегам