Я пытаюсь преобразовать несколько байтовых массивов (хранящихся в SQL Server 2008 R2 как varbinary (8000)) в изображения, чтобы я мог прикрепить их к PDF файлу (пример приведен ниже). Я продолжаю получать "Параметр недействителен". при создании изображения из MemoryStream. Любая помощь по этому поводу?
MemoryStream memoryStream = new MemoryStream(byteArray);
Image image = Image.FromStream(memoryStream);
Bitmap bitmap = new Bitmap(image);
Это
% file output
output: PCX ver. 2.8 image data, with palette
под linux я просто трансформировал ваш гекс-поток из обычного текста в двоичный файл с именем output
эхо "" | xxd -p -r> выход
а затем простую часть с file output
чтобы получить имя формата файла из file
утилиты.
Выбранный массив байтов составляет 1117 байт. Это не равномерно делится на 4 или 3, поэтому я уверен, что изображение не является сырым байтом и фактически закодировано в некотором виде изображения.
Метод Image.FromStream() не может декодировать кодированное изображение, не зная формат, и массив байтов, который вы указали, не указывает, что это за формат. Поэтому параметр, который вы указали, недействителен. Если вы знаете формат изображения, вы можете попытаться вставить заголовок в массив байтов перед остальной частью изображения и посмотреть, помогает ли это. Любопытно, что у вас есть изображение, но не его заголовок, хотя он тоже не является базой-64.
Не зная формат изображения, было бы сложно преобразовать эти байтовые массивы в изображения. Есть ли способ узнать, что это такое? Как восстановить данные изображения?
Во-первых, убедитесь, что вы знаете кодировку, поскольку метод 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);