Сохранение растрового изображения в MemoryStream - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь сохранить растровое изображение в MemoryStream, а затем преобразовать его в строку.Но проблема в том, что у меня ошибка, которая говорит, что строка img.Save(m, img.RawFormat); не может быть null. Ошибка заключается в следующем:

Растровое изображение получено из сканирования отпечатков пальцев, которое я преобразовал в изображение.Теперь я хочу преобразовать его данные в строку, используя MemoryStream.Это для данных отпечатка пальца, которые будут сохранены в базе данных.Я не знаю, где я ошибся.Вы можете найти мой код ниже:

        Bitmap bitmap;
        bitmap = ConvertSampleToBitmap(Sample);
        Bitmap img = new Bitmap(bitmap, fingerprint.Size);
        this.Invoke(new Function(delegate () {
            fingerprint.Image = img;   // fit the image into the picture box
        }));
        string ping;
        using (MemoryStream m = new MemoryStream())
        {
            img.Save(m, img.RawFormat);
            ping = m.ToString();
        }

Я надеюсь на точный ответ, который поможет определить главную ошибку и какие части кода мне следует изменить.Хотя любая помощь будет высоко ценится.

1 Ответ

0 голосов
/ 30 января 2019

Интересный;что происходит здесь:

public void Save(Stream stream, ImageFormat format)
{
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    ImageCodecInfo encoder = format.FindEncoder();
    this.Save(stream, encoder, null);
}

с внутренним Save, выполняющим эту проверку:

public void Save(Stream stream, ImageCodecInfo encoder, EncoderParameters encoderParams)
{
    if (stream == null)
    {
        throw new ArgumentNullException("stream");
    }
    if (encoder == null)
    {
        throw new ArgumentNullException("encoder");
    }

так;мы можем предположить, что format.FindEncoder(); возвращает null здесь.Как это бывает, это действительно значение по умолчанию, если нет подходящего кодека:

internal ImageCodecInfo FindEncoder()
{
    foreach (ImageCodecInfo info in ImageCodecInfo.GetImageEncoders())
    {
        if (info.FormatID.Equals(this.guid))
        {
            return info;
        }
    }
    return null;
}

Так что в принципе это не ясно, но проблема в том, что не найден кодировщик для формата изображения, который выИспользуешь.Попробуйте сохранить как известный формат, не обязательно тот, из которого он загружен.Может быть, использовать ImageFormat.Png и сохранить его как png?

img.Save(m, ImageFormat.Png);

и, как уже упоминалось в комментариях, чтобы получить base-64, вам понадобится:

ping = Convert.ToBase64String(m.GetBuffer(), 0, (int)m.Length);
...