Как я могу взять байтовый массив изображения TIFF и превратить его в объект System.Drawing.Image? - PullRequest
5 голосов
/ 28 августа 2008

У меня есть массив 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 в объект Image?

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

Ответы [ 3 ]

3 голосов
/ 28 августа 2008

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

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

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

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

2 голосов
/ 28 августа 2008

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

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

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

MemoryStream ms = new MemoryStream(byteArrayIn);

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

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

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

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

1 голос
/ 18 февраля 2014

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

Как Time Saunders написал в своем ответе, что метод Write для фактической записи байтов в поток памяти необходим. Это была моя первая ошибка.

Тогда мои данные тоже были неверными данными 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!

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

...