Как я могу взять массив байтов изображения в формате TIFF и превратить его в объект System.Drawing.Image?

StackOverflow https://stackoverflow.com/questions/32750

  •  09-06-2019
  •  | 
  •  

Вопрос

У меня есть byte[] массив, содержимое которого представляет файл TIFF (например, если я записываю эти байты непосредственно в файл, используя BinaryWriter объект, он формирует совершенно корректный файл TIFF), и я пытаюсь превратить его в объект System.Drawing.Image, чтобы я мог использовать его для последующих манипуляций (загрузка в многостраничный объект TIFF)

Проблема, с которой я сталкиваюсь, заключается в том, что общепринятый код для этой задачи:

    public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms, true);
        return returnImage;
    }

у меня это не работает.Вторая строка приведенного выше метода, где он вызывает Image.FromStream метод умирает во время выполнения, говоря

Parameter Not Valid

Я считаю, что метод задыхается из-за того факта, что это файл TIFF, но я не могу понять, как сделать FromStream метод принимает этот факт.

Как мне превратить массив байтов изображения в формате TIFF в объект изображения?

Кроме того, как я уже сказал, конечной целью этого является получение массива байтов, представляющего многостраничный файл TIFF, который содержит файлы TIFF, для которых у меня сейчас есть объекты массива байтов.Если есть гораздо лучший способ сделать это, я полностью за.

Это было полезно?

Решение

Редактировать: Приведенное ниже предположение неверно, у меня была возможность запустить свою IDE позже и протестировать с записью и без нее, и оба они правильно заполнили MemoryStream.

Я думаю, сначала вам нужно написать в свой MemeoryStream.

Как будто моя память (без каламбура) верно служит мне в этом:

MemoryStream ms = new MemoryStream(byteArrayIn);

Создает поток памяти такого размера.

Затем вам нужно записать содержимое вашего массива байтов в поток памяти:

ms.Write(byteArrayIn, 0, byteArrayIn.Length);

Посмотрим, исправит ли это ситуацию.

Другие советы

Хорошо, я нашел проблему, и она была связана с частью кода, не связанной с той частью кода, о которой я спрашивал.Данные передавались в виде строки, я преобразовывал их в массив байтов (это была тестовая установка, поэтому я пытался смоделировать массив байтов, который я получаю в основном приложении), затем преобразовывал это в MemoryStream, затем создавал из этого изображение.

Чего я не смог понять, так это того, что строка была закодирована в Base64.Зовущий Convert.FromBase64String() заставил его превратиться в массив байтов, который не уничтожил бы Image.FromStream() способ.

Так что в основном все свелось к глупой ошибке с моей стороны.Но, эй, приведенный выше код все еще полезен, и эта страница, вероятно, послужит результатом Google о том, как избежать этой ошибки кому-то другому.

Кроме того, я нашел простой способ создать многостраничный TIFF-файл из моих байтовых массивов здесь.

Все это были подсказки, которые помогли мне разобраться в моей проблеме, которая была той же проблемой, что и в вопросе.Итак, я хочу опубликовать свое решение, к которому я пришел благодаря этим полезным подсказкам.Спасибо за все подсказки, опубликованные до сих пор!

Как сообщил Тайм Сондерс в своем ответе, этот метод записи для фактической записи байтов в поток памяти имеет важное значение.Это была моя первая ошибка.

Тогда мои данные тоже были плохими данными TIFF, но в моем случае у меня был дополнительный символ 13 в начале моих данных изображения.Как только я удалил это, у меня все заработало нормально.

Когда я прочитал о некоторых базовых спецификациях формата файлов TIFF, я обнаружил, что файлы TIFF должны начинаться с II или MM (два байта со значениями 73 или 77).II означает, что используется порядок байтов в алфавитном порядке ("Порядок байтов Intel").MM означает, что используется большое окончание ("порядок байтов Motorola").Следующие два байта представляют собой двухбайтовое целое значение (= Int16 в .NET), равное 42, двоичный код 101010.

Таким образом, правильный поток байтов в формате TIFF начинается с десятичных байтовых значений:73, 73, 42, 0 или 77, 77, 0, 42.Я призываю всех, у кого возникла та же проблема, что и у нас, проверить ваш поток байтов данных TIFF и убедиться, что ваши данные являются действительными данными TIFF!

Спасибо Шнапплу и Тиму Сондерсу!!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top