2

I've been searching on the internet and have not found an answer. Would you like to tell me, how to decode from base64 to be Image like line graph? I've been trying to convert from base64 to Byte array first and from Byte array to Image.

Private Function convertbytetoimage(ByVal BA As Byte())
     Dim ms As MemoryStream = New MemoryStream(BA)
     image = Image.FromStream(ms) 'I always get wrong in this line.
     Return image
 End Function
Paul Karam
  • 4,052
  • 8
  • 30
  • 53
  • It would be a good idea to include the error you're getting at that line. – Paul Karam Mar 27 '18 at 07:56
  • 1
    Base64 is a string, not a Byte(). You'll need to change the function signature and insert Convert.FromBase64String(). If it still fails then the base64 string does not represent a properly encoded image, the way it is encoded in a file on disk. You'll need to document where it came from, or ask the programmer who wrote the code that generated the string. – Hans Passant Mar 27 '18 at 07:56
  • the error is: Parameter is not valid @Paul Karam – Winda Sari Elisabeth Siburian Mar 27 '18 at 09:13
  • @HansPassant: this isi what I code before above: base64decode = rtb_code.Text data = Convert.FromBase64String(base64decode) –‘base64decode is the string rtb2.Text = BitConverter.ToString(data) End Sub And then I call the code above – Winda Sari Elisabeth Siburian Mar 27 '18 at 09:48

1 Answers1

5

Looking at your code, your problem could be using the variable name image instead of something like _image.

Keep in mind that VB is not case sensitive like C# and other programming languages.

In your code, I assume you defined your image variable as Image.

To use the static Image.FromStream(ms), you either need to use the fully qualified name of Image or change your variable name.

Here's how you can fix your code:

Private Function convertbytetoimage(ByVal BA As Byte())
    Dim ms As MemoryStream = New MemoryStream(BA)
    image = System.Drawing.Image.FromStream(ms)
    Return image
End Function

Or you can do this by changing your variable name, such as:

Dim _image as Image

Private Function convertbytetoimage(ByVal BA As Byte())
    Dim ms As MemoryStream = New MemoryStream(BA)
    _image = Image.FromStream(ms)
    Return _image
End Function

#Update:

You can try to convert the Byte array to Image also by using ImageConvertor:

Private Function convertbytetoimage(ByVal BA As Byte())
    Dim converter As ImageConverter = New ImageConverter()
    _image = CType(converter.ConvertFrom(BA), Image)
    Return _image
End Function

#Update 2:

Since it looks like that the main problem is with the base64 string. Please have a look at my small demo that convert an Image from inside a PictureBox to base64 string, then to Byte array, and at the end, back to an Image.

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim base64String = ConvertImageToBase64String() 'Using Functions To Make the code tidier
    Dim byteArray = ConvertBase64ToByteArray(base64String) 'Using Functions To Make the code tidier
    Dim image = convertbytetoimage(byteArray) 'Using Functions To Make the code tidier
    PictureBox2.Image = image 'since we're using a small windows form app, we'll set back the image to a second picture box.
End Sub

Public Function ConvertImageToBase64String() As String
    Using ms As New MemoryStream()
        PictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png) 'We load the image from first PictureBox in the MemoryStream
        Dim obyte = ms.ToArray() 'We tranform it to byte array..

        Return Convert.ToBase64String(obyte) 'We then convert the byte array to base 64 string.
    End Using
End Function

Public Function ConvertBase64ToByteArray(base64 As String) As Byte()
    Return Convert.FromBase64String(base64) 'Convert the base64 back to byte array.
End Function

'Here's the part of your code (which works)
Private Function convertbytetoimage(ByVal BA As Byte())
    Dim ms As MemoryStream = New MemoryStream(BA)
    Dim image = System.Drawing.Image.FromStream(ms)
    Return image
End Function

Note that after converting the Image to base64 string, it looks something like that (keep in mind that each image is different, hence you won't get the same string):

/9j/4AAQSkZJRgABAQEAYABgAAD/4QBaRXhpZgAATU0AKgAAAAgABQMBAAUAAAABAAAASgMDAAEAAAABAAAAAFEQAAEAAAABAQAAAFERAAQAAAABAAAAAFESAAQAAAABAAAAAAAAAAAAAYagAACxj//bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicgIiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIADAAMAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APDdH01tY1a3sElWIzMQZGBIUAEk4HXgGvfvC/hPTbDSIzZabLcjnMyxoC54zlzgtyo46A5xjNeC6BfR6brtpdTcRI+HPPyhgVJ45OM5x7V9kaFYpYeH7W1keNpIU2O0ZypIPOD6ZrhxSlKXLfSx14eUYx5utzy3U7C7uL1bZLZoI26tIm3Ht715/wCNdK0p45JbRf3yIWaXHJKjv7YGOc4r6C1qIS2VxGOrIQPrjivn7xNbSWVtdW8wAkEbE4Of4a4sPN+0sddVKVO7R5tRRRXtnkhX1d4N8V2+seGrOcTw+e8CSTRxlvkY5VuG5ALq+O3HFfPngHwmPFeueTMSLWHDSY/jJPC5HIyAxz/s4yCQa+iItJtdIt7a0tYIVjV0QIiBV5YA8DA5yT9ea5cVQdWK5XZo3oVVTeuzDV9XRYHKsMAcmvn/AMdXV214wIJhm+ZpMdDk4X26Z96+i/EHhm2htWubpgiL8scaMcu3+FedalotjOhSVM57nkfjXJgcLOMnUqHTisRBwUIHg1FdR4n8LNpcbXttG32VZBFIAGIjYgleffaep7H8OXr1Tzz2D4OExWU829wBO42hztJ2pyR0JHY9sn1NesQT/atTsoyes6E/gc/0r5p8LeK5/DlwAQ8lqzF2SMqrbtuM5IOR0JHGdo5Fer6N4+0rUfLKXSw3G0nY3BB289fQE8+xoA7zxPq/9pagyo3+jw5VPf1NcXqMw55qefUoSnySKR6g1z9/fKc/OPzoA5vx0TJpgYOw5UkA/e7YP8/wrzuuz8VajDcWQgEqhwBwTyef/rVxlAH/2Q==

If you look at the first 5 characters of the string, you notice it's equal to /9j/4 which means that the file represented by this string is a PNG file, you may look at my old answer to see how to validate a base64 string.

Another note, I used a small PNG image, hence I used the next format:

PictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Png) 

If you have another Format and you want to use same code, make sure to change the format.

Heretic Monkey
  • 11,687
  • 7
  • 53
  • 122
Paul Karam
  • 4,052
  • 8
  • 30
  • 53