2010-04-04 1 views
3

Ну вот, я пытаюсь собрать изображение, которое закодировано как шестнадцатеричная строка в XML-файле. Я искал ответы на все это и не смог найти нигде. Вот что у меня есть сейчас.Получение изображения JPEG из шестнадцатеричной строки в XML

byte[] bytes = Convert.FromBase64String(FilterResults("PHOTOGRAPH")); 
MemoryStream mem = new MemoryStream(bytes); 
Image bmp2 = Image.FromStream(mem); 

return bmp2; 

Функция FilterResults просто возвращает строку из XML. Я могу получить строку символов и преобразовать ее в байт [], но как только я выполню Image.FromStream (mem), я получаю ошибку «Параметр неправильной».

Любые идеи?

+0

Предполагая, что FilterResults возвращает строку правильно (что, вероятно, делает, потому что FromBase64String бы исключение, если оно недействительно base64), я не вижу ничего плохого в вашем коде. Вы уверены, что данные на самом деле являются изображениями в формате JPEG? Не могли бы вы загрузить файл XML где-нибудь? –

+0

Он просто не кодируется как изображение с включенным заголовком изображения. Опубликуйте первые 8 байтовых значений, которые вы видите. –

+0

Это 8 лучших байтов из документа/блока данных ffd8ffe0 –

ответ

3

Фрагмент кода верен (хотя MemoryStream реализует IDisposable и поэтому должен быть обернут в блок using).

Image.FromStream только выбрасывает ArgumentException, если он не распознает формат изображения в потоке. Поэтому, если нет какого-либо кода, который вы не показываете, проблема должна быть с самим изображением.

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

string imageBase64; 
using (Image image = Image.FromFile(@"C:\path_to_image.jpg")) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     image.Save(ms, ImageFormat.Jpeg); 
     imageBase64 = Convert.ToBase64String(ms.ToArray()); 
    } 
} 
Console.WriteLine(imageBase64.Length); 

byte[] imageData = Convert.FromBase64String(imageBase64); 
using (MemoryStream ms = new MemoryStream(imageData)) 
{ 
    using (Image image = Image.FromStream(ms)) 
    { 
     Console.WriteLine(image.Width); 
    } 
}