C # не может использовать поток памяти для преобразования байтового массива в растровое изображение - PullRequest
0 голосов
/ 25 сентября 2018

Я искал несколько дней, и все текущие ответы о том, как преобразовать байт [], заполненный imageData, приводит меня к этому куску кода:

using (var ms = new MemoryStream(byte[])) 
{
  Bitmap bit = new Bitmap(ms);
}

что-то вроде этого, по крайней мере (Я сделал так много версий этого к настоящему времени. Я не помню оригинал), но независимо от того, как я его использую, я всегда получаю «неверный параметр» для параметра, когда пытаюсь поместить поток в мое растровое изображение.

вот как я сейчас сохраняю это:

private static byte[] ConvertToByteArr(Bitmap bitmap)
    {
        byte[] result;            
        MemoryStream stream = new MemoryStream();
        bitmap.Save(stream, ImageFormat.Bmp);            
        result = stream.ToArray();

        return result;
    }

и вызываю его, когда я сохраняю свой словарь в файл .txt

вот так яЯ пытаюсь прочитать это снова.

 TextReader reader = new StreamReader(trainingPath + "\\" + filename + ".txt");
        Dictionary<string, string> tempDict = new Dictionary<string, string>();
        String line;
        String[] parts;

        List<string> names = new List<string>();

        while ((line = reader.ReadLine()) != null)
        {
            parts = line.Split('=');

            string key = parts[0];
            string value = parts[1];
            tempDict.Add(key, value);

            Console.WriteLine("added " + key + " to temp Dict");

            byte[] byteArr = Encoding.ASCII.GetBytes(tempDict[key]);

            MemoryStream ms = new MemoryStream(byteArr);

            Bitmap bit = new Bitmap(Image.FromStream(ms));

            parts[0] = null;
            parts[1] = null;

        }

все работает, пока строка Bitmap bit = new Bitmap (Image.Fromstream (ms))).

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Когда вы читаете из текстового файла, убедитесь, что используется кодировка.Я попробовал пример кода, где я сохранил растровое изображение как byte [] в текстовый файл, используя тот же метод, упомянутый (ConvertToByteArr).Я получил ту же ошибку, когда попытался создать растровый объект из потока памяти, считанного из потокового ридера этого сохраненного текстового файла.

Но когда я использовал кодировку ASCII, он работал нормально.

TextReader reader =новый StreamReader (текстовый файл, Encoding.ASCII, true);

0 голосов
/ 25 сентября 2018

Использование Encoding.GetBytes () и Encoding.GetString () не рекомендуется.
В некоторых случаях приведенное выше взаимное преобразование не подходит.
(Как вы уже видели)

Я бы порекомендовал использовать шестнадцатеричную строку.
Вы можете преобразовать байтовый массив в строку (Hexademical) следующим образом:

byte[] byteArr = ConvertToByteArr(bitmap);
string str = BitConverter.ToString(byteArr).Replace("-", "");


Кроме того, вы можете преобразовать строку (описано выше)в байтовый массив следующим образом:

private byte[] HexaToBytes(string str)
{
    byte[] byteArr = new byte[str.Length / 2];
    for (int i = 0; i < byteArr.Length; i++)
    {
        string s = str.Substring(i * 2, 2);
        byteArr[i] = Convert.ToByte(s, 16);
    }
    return byteArr;
}
...