Отображение байтового массива изображения сканера 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));