Я использую устройство штрих-кода с командами 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