Как преобразовать поток памяти в массив строк и наоборот

У меня есть код, в котором я хочу получить поток из изображения и преобразовать поток памяти в массив строк и сохранить в переменной. Но моя проблема в том, что я также хочу получить изображение из строковой переменной и нарисовать в окне изображения.

Если я использую это как PictureBox1.Image = image.FromStream(memoryStream), я могу распечатать изображение в окне изображения. Но это не моя потребность. Я просто хочу получить поток изображений из файла и преобразовать поток в виде текста и сохранить его в некоторой строковой переменной, и снова я хочу использовать строковую переменную и преобразовать ее в поток для печати изображения в окне изображения.

Вот мой код. (Vb Express 2008)

 Public Function ImageConversion(ByVal image As System.Drawing.Image) As String
        If image Is Nothing Then Return ""

        Dim memoryStream As System.IO.MemoryStream = New System.IO.MemoryStream
        image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Gif)

        Dim value As String = ""


        For intCnt As Integer = 0 To memoryStream.ToArray.Length - 1
            value = value & memoryStream.ToArray(intCnt) & "  "
        Next

        Dim strAsBytes() As Byte = New System.Text.UTF8Encoding().GetBytes(value)
        Dim ms As New System.IO.MemoryStream(strAsBytes)


        PictureBox1.Image = image.FromStream(ms)

        Return value
    End Function

person SmileAshis    schedule 19.01.2014    source источник
comment
Мне просто любопытно - зачем вам нужно конвертировать/загружать изображение в поток памяти, чтобы показать его в окне изображения, и нельзя ли просто сохранить изображение прямо в файловую систему, а затем загрузить его стандартными методами ?   -  person keenthinker    schedule 19.01.2014
comment
Спасибо за ответ. Но я знаю стандартные методы. Я просто хочу загрузить строковую переменную в Rich Text Box. Где я получаю 71 70 56 255 240 15.... (зависит от изображения) значение RGB, и я хочу изменить значение вручную только для эксперимента и перепаковать в изображение, и я хочу увидеть изменение. :)   -  person SmileAshis    schedule 19.01.2014


Ответы (1)


Это не сработает так, как вы его опубликовали (по крайней мере, часть воссоздания изображения). Видеть это:

Public Function ImageConversion(ByVal image As System.Drawing.Image) As String
    If image Is Nothing Then Return ""

    Dim memoryStream As System.IO.MemoryStream = New System.IO.MemoryStream
    image.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Gif)

    Dim value As String = ""

    Dim content As Byte() = memoryStream.ToArray()
    ' instead of repeatingly call memoryStream.ToArray by using
    ' memoryStream.ToArray(intCnt)
    For intCnt As Integer = 0 To content.Length - 1
        value = value & content(intCnt) & "  "
    Next
    value = value.TrimEnd()

    Return value
End Function

Чтобы воссоздать изображение с использованием созданной строки, вы не можете использовать Encoding.GetBytes(), как вы это делали, потому что вы получите массив байтов, который представляет вашу строку. Например, «123 32 123» вы не получите массив байтов с элементами 123, 32, 123.

Public Function ImageConversion(ByVal stringRepOfImage As String) As System.Drawing.Image
    Dim stringBytes As String() = stringRepOfImage.Split(New String() {" "}, StringSplitOptions.RemoveEmptyEntries)
    Dim bytes As New List(Of Byte)
    For intCount = 0 To stringBytes.Length - 1
        Dim b As Byte
        If Byte.TryParse(stringBytes(intCount), b) Then
            bytes.Add(b)
        Else
            Throw new FormatException("Not a byte value")
        End If
    Next
    Dim ms As New System.IO.MemoryStream(bytes.ToArray)
    Return Image.FromStream(ms)
End Function

Ссылка: Byte.TryParse

person Heslacher    schedule 19.01.2014
comment
Извините, я не могу понять эту часть, можете ли вы объяснить это? ' Dim b As Byte If Byte.TryParse(stringBytes(intCount), b) Then bytes.Add(b) End If' - person SmileAshis; 19.01.2014
comment
Предположим, вы изменили значения внутри вашего RichTextBox на значение, которое больше не может привести к правильному изображению. - person Heslacher; 19.01.2014
comment
Теперь я понимаю, когда я меняю значение из rtf и передаю значение rtf функции, она генерирует исключение. - person SmileAshis; 19.01.2014
comment
Нет, для этого вам понадобится оператор else. Byte.TryParse пытается преобразовать строковое значение в байтовое значение. Если это невозможно из-за невозможности анализа, вы должны создать исключение. Я обновил код. - person Heslacher; 19.01.2014
comment
Спасибо. Но не могли бы вы сказать мне, что после преобразования в строку и отображения в rtf моя строка выглядит как 71 73 70 56 57 97 125 0 127 0 247 0 0..... Но когда я меняю значения от 71 до 97, возникает исключение. Но после 97, если я изменю значение 125, чтобы изображение хорошо отображалось в окне изображения. Я не знаю, это структура файла gif, и я меняю, не зная формата. Немного не в тему, но можешь мне объяснить? - person SmileAshis; 19.01.2014
comment
Нет, не совсем. Попробуйте опубликовать новый вопрос, возможно, вам поможет эксперт по изображениям. - person Heslacher; 20.01.2014