Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

В чем разница между сохранением Bitmap в byte[] с помощью ImageConverter и MemoryStream?

#c_sharp #массивы #net #изображения #bitmap


Допустим, есть функция для перевода Bitmap в byte[]:

public byte[] BitmapToByte(Bitmap bitmap)
{
    using (var stream = new MemoryStream())
    {
        bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
        return stream.ToArray();
    }
}


Не очень эффективно, зато просто и надежно. А главное - понятно, что получается в
результате - файл в формате BMP (кстати, можно еще задать формат MemoryBmp, но в чем
его смысл, я так и не смог уразуметь - буду благодарен, если кто-то просветит, хотя
вопрос и не об этом).

Все хорошо, но я в порядке эксперимента попытался переделать функцию вот так:

public byte[] BitmapToByte(Bitmap bitmap)
{
    return (byte[])(new ImageConverter()).ConvertTo(bitmap, typeof(byte[]));
}


В результате получается какая-то белиберда, явно не в формате BMP (хотя бы потому
что первые два байта - не ASCII-коды символов "BM"). Но что именно получается - я так
и не смог понять, хотя и гуглил, и stackoverflow читал.

В большинстве источников эти два способа подаются как альтернативные. Нашел только
один вопрос на stackoverflow, там все же уточнялось, что формат другой. Но какой именно
и как, какой опцией проконтролировать его выбор - непонятно.
    


Ответы

Ответ 1



ImageConverter использует формат по умолчанию, то есть вызывает просто: bitmap.Save(stream); В зависимости от того, как вы создавали или загружали файл, формат может быть различным, например, GIF или PNG. Если не получается сохранить в оригинальном формате (например, ICO) или это приведёт к потерям (например, JPEG), то используется PNG. Если вы просто создали картинку, ни откуда не загружая, то тоже будет использован PNG.

Комментариев нет:

Отправить комментарий