Я пытаюсь преобразовать изображение скриншота 32bpp в формат 8bpp (или 4bpp или 1bpp) с помощью С#. Я уже рассмотрел несколько ответов stackoverflow на похожие темы, и большинство из них предлагает варианты с использованием следующего кода:
public static Bitmap Convert(Bitmap oldbmp)
{
Bitmap newbmp = new Bitmap(oldbmp.Width, oldbmp.Height, PixelFormat.Format8bppIndexed);
Graphics gr = Graphics.FromImage(newbmp);
gr.PageUnit = GraphicsUnit.Pixel;
gr.DrawImageUnscaled(oldbmp, 0, 0);
return newbmp;
}
Однако, когда это выполняется, я получаю исключение: A graphics object cannot be created from an image that has an indexed pixel format
. Я понимаю, что изображения 8, 4 и 1bpp имеют сопоставления таблиц цветов, а не сами пиксели изображения (как в 32 или 16bpp-изображениях), поэтому я предполагаю, что я где-то пропускаю какой-то шаг преобразования, но я довольно новичок в С# с фона на С++) и предпочли бы, чтобы это можно было использовать с использованием собственных вызовов С#, а не прибегать к PInvoking BitBlt
и GetDIBits
и т.д. Кто-нибудь может помочь мне решить эту проблему? Спасибо.
EDIT: я должен указать, что мне нужно, чтобы это было обратно совместимо с .NET framework 2.0