Преобразование в реальный формат JPEG 8bpp

1

Я уже искал и пробовал все предложения, предоставленные ему в 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() работает как шарм.

  • 1
    Зачем вам нужно, чтобы JPG был 8-битным? К вашему сведению, некоторые люди, похоже, ссылаются на изображение, где каждый канал (R, G, B) имеет 8 бит как «8-битный JPG». Если это то, что вы после, то я думаю, что у вас есть. 8 бит на канал дают 24-битный цвет.
  • 0
    Формат изображения по умолчанию для перегрузки Image.Save (string) - PNG, а не BMP.
Теги:
image-processing

1 ответ

0
Лучший ответ

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.

  • 0
    Пробовал использовать EncoderParameters, но это не имело никакого значения. Сделано 2 сохранения: myImage.Save ("image_JPEG.jpg", ImageFormat.Jpeg); и myImage.Save ("image_JPEG.jpg", jpgCodec, encoderParams); и afet провели сравнение двоичных файлов, и оба файла были абсолютно одинаковыми.
  • 0
    Только что попробовал EncoderParameters, чтобы указать ColorDepth для формата TIFF, и он работает правильно, но он не имеет разницы в формате Jpeg.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню