Попробуйте это:
ImageCodecInfo pngCodec = ImageCodecInfo.GetImageEncoders().Where(codec => codec.FormatID.Equals(ImageFormat.Png.Guid)).FirstOrDefault();
if (pngCodec != null)
{
EncoderParameters parameters = new EncoderParameters();
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 8);
myImage.Save(myStream, pngCodec, parameters);
}
Все форматы изображения эффективно поддерживают глубины младшего бита. Вы просто оставляете последние биты неиспользованными, если не нужный. GIF только поддерживает низкий цвет; Вы ограничиваетесь 256 цветами.
Непротестированный код -
Image myImage = new Image();
EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.ColorDepth, 8);
myImage.Save(somestream, ImageFormat.Png, parameters);
Посмотрите на Систему. Рисование. Пространство имен обработки изображений и имеет игру с установками параметров Encoder.xxx и изображением. Сохраните метод. HTH.
Обновление, которое также стоит отметить, что, если Вы хотите маленькое изображение (количество младшего байта) можно попытаться сохранить как JPEG Кодер использования. Сжатие сжатия, но в качестве изображения стоится.
Я не думаю, что другой ответ проверил свой код, поскольку GDI + PNG не поддерживает Encoder.BitDepth EncoderParameter. Фактически, единственный кодек, который это делает, - это TIFF.
Вам необходимо изменить PixelFormat вашего изображения перед сохранением, чтобы иметь какой-либо эффект на выходе. Это не всегда дает ожидаемый PixelFormat. См. мой пост здесь для получения дополнительной информации о том, какие форматы PixelFormats во что превращаются.
Что касается преобразований PixelFormat, будет работать что-то вроде следующего:
private Bitmap ChangePixelFormat(Bitmap inputImage, PixelFormat newFormat)
{
Bitmap bmp = new Bitmap(inputImage.Width, inputImage.Height, newFormat);
using (Graphics g = Graphics.FromImage(bmp))
{
g.DrawImage(inputImage, 0, 0);
}
return bmp;
}
К сожалению, эти преобразования могут привести к очень плохому результату. Это особенно верно в случае, когда вы выполняете преобразование с потерями (большая битовая глубина в меньшую).