отображение байтового массива изображения сканера OPOS - PullRequest
0 голосов
/ 10 декабря 2018

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

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

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

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

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-й: преобразование байтов в массив изображений

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

0 голосов
/ 10 декабря 2018

Можете ли вы попробовать это?

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