Как я могу взять массив байтов изображения в формате TIFF и превратить его в объект System.Drawing.Image?
Вопрос
У меня есть 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!
Спасибо Шнапплу и Тиму Сондерсу!!