Преобразование байтового массива в изображение «Параметр недействителен».

1

Я пытаюсь преобразовать несколько байтовых массивов (хранящихся в SQL Server 2008 R2 как varbinary (8000)) в изображения, чтобы я мог прикрепить их к PDF файлу (пример приведен ниже). Я продолжаю получать "Параметр недействителен". при создании изображения из MemoryStream. Любая помощь по этому поводу?

MemoryStream memoryStream = new MemoryStream(byteArray);
Image image = Image.FromStream(memoryStream);
Bitmap bitmap = new Bitmap(image);

Теги:
varbinary
bytearray

3 ответа

2
Лучший ответ

Это

% file output 
output: PCX ver. 2.8 image data, with palette

под linux я просто трансформировал ваш гекс-поток из обычного текста в двоичный файл с именем output

эхо "" | xxd -p -r> выход

а затем простую часть с file output чтобы получить имя формата файла из file утилиты.

  • 0
    Большое спасибо! Зная, что шестнадцатеричный поток представляет собой изображение PCX, я использовал Magick.NET для преобразования байтового массива в bmp и вставки bmp в документ PDF. Еще раз спасибо!
0

Выбранный массив байтов составляет 1117 байт. Это не равномерно делится на 4 или 3, поэтому я уверен, что изображение не является сырым байтом и фактически закодировано в некотором виде изображения.

Метод Image.FromStream() не может декодировать кодированное изображение, не зная формат, и массив байтов, который вы указали, не указывает, что это за формат. Поэтому параметр, который вы указали, недействителен. Если вы знаете формат изображения, вы можете попытаться вставить заголовок в массив байтов перед остальной частью изображения и посмотреть, помогает ли это. Любопытно, что у вас есть изображение, но не его заголовок, хотя он тоже не является базой-64.

Не зная формат изображения, было бы сложно преобразовать эти байтовые массивы в изображения. Есть ли способ узнать, что это такое? Как восстановить данные изображения?

  • 0
    Нет, мы никак не можем узнать, что это за изображения. Мне не нужно хранить данные, полученные после преобразования, мне просто нужно нарисовать изображение / логотип на билете (это документ PDFSharp).
0

Во-первых, убедитесь, что вы знаете кодировку, поскольку метод Image.FromStream знает только ограниченное количество форматов.

Убедитесь, что позиция вашего MemoryStream правильно установлена на 0, а не до конца - в противном случае любые чтения начнутся с конца, будут казаться пустыми, а не начинаться с начала.

Кроме того, обратите внимание, что

Этот конструктор не раскрывает базовый поток. GetBuffer выбрасывает UnauthorizedAccessException. 1

Таким образом, это может быть вызвано тем, как Bitmap обрабатывает базовый поток. ЕСЛИ нужно, попробуйте сделать пустой запоминающий поток, скопировав в него байт, а затем сбросив положение

MemoryStream memoryStream = new MemoryStream();
foreach(var b in byteArray) memoryStream.WriteByte(b);
memoryStream.Position = 0;
Image image = Image.FromStream(memoryStream);
  • 0
    Любые идеи относительно того, что я могу сделать, если у меня нет возможности сказать, в каком формате были закодированы данные?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню