Проблема чтения некоторых байтовых данных в растровое изображение - PullRequest
0 голосов
/ 06 апреля 2009

Я пытаюсь прочитать жестко закодированное растровое изображение в растровый объект. Я продолжаю получать ту же ошибку:

System.ArgumentException: параметр имеет значение недействительно.

Это код, который у меня есть ...

const string fakeByteData = "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==";

Stream stream = new MemoryStream(Encoding.ASCII.GetBytes(fakeByteData));
var bitmap = new Bitmap(stream);

Да, я не использовал какие-либо операторы 'using' для удаленного содержимого, потому что я пытался понять, почему этот фрагмент байтовых данных имел ошибку. Это некоторый случайный код, который у меня есть в очень временном модульном тесте.

Я при условии, что содержание fakeByteData является законным.

Кто-нибудь может пролить немного света здесь?

Ответы [ 4 ]

3 голосов
/ 06 апреля 2009

Это строка base64, но в ней нет изображения.

Если вы выгружаете данные на диск после декодирования base64, вы обнаружите, что это просто байты 0x00, 0x01, 0x02 и т. Д. Вплоть до 0xff.

РЕДАКТИРОВАТЬ: Чтобы ответить на ваш комментарий в вопросе: это «плохие» данные в том, что они не представляют изображение. Возможно, вы захотите провести модульный тест для такого случая, но вы не можете написать модульный тест, который ожидает real изображение, основанное на данных, которые не представляют действительное изображение.

Как вы будете получать данные изображения в реальной жизни? Будет ли это строка в кодировке base-64? Если это так, вот некоторые примеры действительных данных для красного пятна, взятые из записи в Википедии для схемы URI данных :

string fakeByteData = 
    "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP"
    + "C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA"
    + "AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J"
    + "REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq"
    + "ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0"
    + "vr4MkhoXe0rZigAAAABJRU5ErkJggg==";
3 голосов
/ 06 апреля 2009

Вы уверены, что fakeByteData не в кодировке Base64 ? Обычно это способ хранения данных изображения (двоичных) в виде строки ...

"==" в конце вашей строки выглядит также как символы заполнения, используемые в кодировке Base64.

Что происходит, когда вы пытаетесь:

Stream stream = new MemoryStream(Convert.FromBase64String(fakeByteData));

Обновление: я попытался декодировать fakeByteData, используя онлайн-декодер / кодер , и не смог загрузить изображение. При просмотре содержимого это выглядит как очень поддельные данные:


! "# $% & '() * +, - / 0123456789:;. <? => @ ABCDEFGHIJKLMNOPQRSTUVWXYZ [] ^ _` ABCDEFGHIJKLMNOPQRSTUVWXYZ {|} ~ €, ƒ «... † ‡ ‰ Š œžŸ ¡¢ £ ¤ ¥ |§¨ © ª «¬®¯ ° ± ²³'μ¶ · ¸¹º» ¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ × ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö ÷ øùúûüýþÿ

Это, конечно, не должно создавать какой-либо образ, который я знаю; похоже, это последовательный массив байтов 00-FF. Поэтому я думаю, что ваша проблема в данных.

0 голосов
/ 13 марта 2013
string fakeByteData = "iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABGdBTUEAALGP"
    + "C/xhBQAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9YGARc5KB0XV+IA"
    + "AAAddEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIFRoZSBHSU1Q72QlbgAAAF1J"
    + "REFUGNO9zL0NglAAxPEfdLTs4BZM4DIO4C7OwQg2JoQ9LE1exdlYvBBeZ7jq"
    + "ch9//q1uH4TLzw4d6+ErXMMcXuHWxId3KOETnnXXV6MJpcq2MLaI97CER3N0"
    + "vr4MkhoXe0rZigAAAABJRU5ErkJggg==";

Stream stream = new MemoryStream(Convert.FromBase64String(fakeByteData));

Это помогло мне с моим модульным тестом получить изображение

0 голосов
/ 06 апреля 2009

Является ли растровое изображение фактическим растровым изображением? Чтобы создать растровое изображение из потока, поток должен содержать данные, которые обычно содержатся в файле растрового изображения. Это включает в себя заголовки и тому подобное.

Если байтовые данные предназначены для предоставления действительного изображения, а не всего файла, сначала необходимо создать новое растровое изображение с требуемым размером и форматом изображения. Затем вы должны заблокировать растровое изображение с помощью BitMap.LockBits и использовать Marshal.Copy, чтобы скопировать байтовые данные в растровые данные. В качестве альтернативы вы можете использовать Bitmap.SetPixel и обходить байтовый массив вручную, но это будет намного медленнее.

...