2015-01-30 5 views
-1

Я использую vb.net framework 4.5. С 3-й стороны я получаю файл CSV. В одном блоке их изображение BMP. Я прочитал его из файла как строку.VB.net from string to bitmap

Я хочу преобразовать этот BMP в JPG. Я узнал о классе битмапа в .NET Framework. Это может представлять растровое изображение и сохранять его в формате JPG. Однако конструктор класса битмапа принимает параметр имени файла. Я этого не хочу. Я попытался преобразовать строку в поток памяти IO и прочитать ее в классе битмапа, но это не работает.

Может ли кто-нибудь дать мне указатель на методы/классы, которые можно использовать для достижения этого?

+0

Можете ли вы показать нам, что вы «Пробовал? (в первую очередь, поток для чтения в класс битмапа)? –

+0

Вы уверены, что данные находятся в двоичном формате BMP-файла? Возможно, информация, которую вы читаете, нужно как-то разобрать. –

ответ

0

См. Сообщение this. Предполагая, что ваша строка является допустимой строкой байтов, представляющих изображение, этот пост должен дать вам то, что вы ищете. Примеры кода приведены на C#, но они достаточно просты, чтобы конвертировать в VB.Net.

1

Трудно дать код, когда мы не знаем, формат строки ...

... это может быть базой 64 строка в кодировке. Вот пример, который показывает изображение в PictureBox1 преобразуется в строку основание 64, а затем обратно к изображению и помещен в PictureBox2:

Image via Base 64 String

Dim oldMS As New System.IO.MemoryStream 
    PictureBox1.Image.Save(oldMS, System.Drawing.Imaging.ImageFormat.Jpeg) 
    Dim strData As String = Convert.ToBase64String(oldMS.ToArray) 

    Debug.Print(strData) 

    Dim bytes() As Byte = Convert.FromBase64String(strData) ' strData would come from your CSV file 
    Dim MS As New System.IO.MemoryStream(bytes) 
    Dim bmp As Image = Image.FromStream(MS) 
    PictureBox2.Image = bmp 

Вот как выглядит строка как:

/9j/4AAQSkZJRgABAQEAYABgAAD/4QBORXhpZgAATU0AKgAAAAgABAMBAAUAAAABAAAAPlEQAAEAAAABAQAAAFERAAQAAAABAAAAAFESAAQAAAABAAAAAAAAAAAAAYagAACxj//bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIACAAIAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/AOG8R69rvjTWdTvpbyVYoGYw24chVUdFUDjO0E++PeuS+13P/PxL/wB9muo8OXzrqF5YgxEmVp4lk4BZc5GexI5/4DjvWRrGkm3uZ5raJltwxJjPLQg9AfUe9ekopLQy5veszO+13P8Az8S/99mur8Pa9rngzW9OvIL6RklZfPt95KkHBKMDxnawPtn2rE0vTd08E91EzwlspAv358dh6D1J/Wr+sXcv261s5PKD+cLiVYjkBmxgbu5xzn/ax2FTJJqw09TFa4ktdVe4iOJI5iynHvXeeGYrDUDDNfTTJJGjTxWSRbmkReSqyZ4DYIww/wDr874v8I6t4a8QXVpdWkxjMjGGYISsik5BBHtWZaz6haxSQrFP5Mi7XUKQcexxx0FHM+X3WEopvU6XxAtlZ3V39keZyQJp7V02sFbBAaTPIGQMKBXJRzSXOqJNKcu8wZjj3qe7lv7pEiMM4hjAVEKk8D1Pc8n+mK0/CPhLVvEmv2tpaWk2zzFMszIQsag5JJ+naknaPvMdknof/9k= 
0

Спасибо за все вдохновение. Это то, что я сделал и что сработало.

Dim bytes() As Byte 
Dim MS As System.IO.MemoryStream 
Dim ImageInStringFormat as string 
Dim NewImage As System.Drawing.Image 

bytes = Convert.FromBase64String(ImageInStringFormat) 
MS = New System.IO.MemoryStream(bytes) 
NewImage = System.Drawing.Image.FromStream(MS) 

NewImage.Save("c:\temp\try.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) 

Последнее замечание. Оказалось, что строка, которую я использовал, не является допустимой строкой Base64. Вы можете проверить это, получив длину строки и проверить, может ли она быть разделена на 4. Нет, at = до конца строки, пока она не будет делящейся на 4. Это выпечет за нее допустимую строку Base64.

0

раствор без необходимости сохранять его в файловую систему:
я объединил ответы на этот вопрос в + How to Convert System.Drawing.Image to Byte Array? к этому:

Function ImageToString(ByVal Img As Image) 
    Dim ImgConverter As New ImageConverter() 
    Dim ImgBytes As Byte() = ImgConverter.ConvertTo(Img, GetType(Byte())) 
    Return Convert.ToBase64String(ImgBytes) 
End Function 

Я надеюсь, что это помогает кто-то :)