Как запретить VS устанавливать на 32ARGB растровое изображение из исходного изображения 8 бит на пиксель

Добавьте 8-битный PNG в файл ресурсов. Если вы попытаетесь использовать его, например:

Bitmap bmp = properties.Resources.My8bppImage;

Формат BMP PixelFormat будет равен 32 ARGB! Но это неправильно, он должен быть проиндексирован 8 бит на пиксель. Как получить правильное растровое изображение?


person Pedro77    schedule 02.04.2012    source источник


Ответы (1)


Здесь у вас не так много вариантов, и редактор ресурсов Visual Studio, и класс Bitmap используют декодер PNG, который преобразует изображение в 32bpp. Это должно быть полезно, 32bpp рендерится красиво и быстро.

Запасной вариант — использовать класс System.Windows.Media.Imaging.PngBitmapDecoder. Вы можете передать ему параметр BitmapCreateOptions.PreservePixelFormat и заставить его сохранить формат 8bpp. Вы можете добавить png в качестве ресурса, сначала переименовав его, скажем, в файл .bin, чтобы он не пытался интерпретировать его как файл изображения, а превращал его в byte[]. Тогда такой код будет работать:

using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.IO;
...
        Stream stream = new MemoryStream(Properties.Resources.marble8);
        PngBitmapDecoder decoder = new PngBitmapDecoder(stream, 
            BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
        BitmapSource bitmapSource = decoder.Frames[0];

Там, где «marble8» было тестовым изображением, которое я использовал, замените свое собственное. Вам потребуется добавить ссылки на сборки WindowsBase и PresentationCore.

person Hans Passant    schedule 02.04.2012
comment
На самом деле это неправильно; класс Bitmap изменяет изображения png на 32-битные только в том случае, если они содержат прозрачность. Я провел некоторое исследование этого странного поведения и нашел обходной путь. - person Nyerguds; 03.11.2017