Я уже искал и пробовал все предложения, предоставленные ему в SO, AForge, FreeImage и пару других веб-сайтов, но я не могу преобразовать изображение в настоящий 8bpp. Я всегда получаю JPEG, сохраненный как 24bpp вместо 8.
После преобразования оттенков серого у меня есть MemoryBMP (согласно myImage.RawFormat), поэтому, когда я сохраняю его так
myImage.Save("image.jpg");
Я получаю изображение 3Mb+ (поэтому я предполагаю, что он сохранен в BMP), который Windows говорит мне, что это 8bpp (но мне нужно, чтобы он был JPEG). Но если я сохраню это так
myImage.Save("image_JPEG.jpg", ImageFormat.Jpeg);
Я получаю изображение 400 Кб (поэтому я предполагаю, что он сохранен в формате JPEG), но он в 24bpp.
Любые идеи, что может быть причиной этого?
РЕДАКТИРОВАТЬ
Как отметил Джэлтон, это ограничение метода Image.Save(), поэтому я изменил его на сохранение изображения с помощью библиотеки FreeImage: FreeImage.SaveBitmap() работает как шарм.
UPDATE: метод Image.Save()
не поддерживает 8 бит на пиксель для формата JPEG. Возможно, вы захотите использовать библиотеку FreeImage, как указано в комментариях ниже.
Если вы хотите уменьшить глубину цвета до 8 бит на пиксель, как правило, это то же самое, что конвертировать из 24-битного цвета в оттенки серого, где каждый цветной канал имеет 8 бит на пиксель. (Другими словами, уменьшение 3-х каналов информации о цвете до 1.)
Кодер по умолчанию при использовании Image.Save()
и указании ImageFormat.Jpeg
равен 24 ImageFormat.Jpeg
, поэтому вам нужно указать кодировщик и указать некоторые параметры:
ImageCodecInfo[] availableCodecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo jpgCodec = availableCodecs.FirstOrDefault(codec => codec.MimeType == "image/jpeg");
if (jpgCodec == null)
throw new NotSupportedException("Encoder for JPEG not found.");
EncoderParameters encoderParams = new EncoderParameters(1);
encoderParams.Param[0] = new EncoderParameter(Encoder.ColorDepth, 8L);
myImage.Save("image_JPEG.jpg", jpgCodec, encoderParams);
Это модифицированный пример из более длинного объяснения, которое я нашел на сайте aspnet-answers.com.