Преобразование растрового изображения в Gray8 с FormatConvertedBitmap использует только 4 бита? - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть BitmapSource (RGB), который я хочу преобразовать в 8bpp в оттенках серого.Вот код, который я использую:

BitmapSource ConvertToGray8(BitmapSource bitmap)
{
    FormatConvertedBitmap newFormattedBitmapSource = new FormatConvertedBitmap();

    newFormattedBitmapSource.BeginInit();
    newFormattedBitmapSource.Source = bitmap;
    newFormattedBitmapSource.DestinationFormat = PixelFormats.Gray8;
    newFormattedBitmapSource.EndInit();

    return newFormattedBitmapSource;
}

Однако, если я посмотрю на полученные байты, я получу что-то вроде этого:

66 66 66 66 77 ff ff ee ff ff ff ff ff ff ff ff ff ee ff ff ff 00 00 00 11 00 00 00 ff
ff dd ff ff ff ff ff ff ff ff ff ff bb 88 88 88 88 ff ff ff ff 99 88 88 88 aa ff ff ff 
ff ff ff ff ff ff ff dd ff 88 00 ff ff 22 ff ff 00 88 ff dd ff ff ff ff ff ff ff ff ff 
ff ff ff ff ff ff ff ff dd ff ff cc 66 66 66 66 66 aa ff ff dd ff ff ff ff ff ff ff ff 
ff ff dd ff ff 33 00 11 11 11 00 22 ff ff dd ff ff ff ff ff ff ff ff ff ff ff 77 88

Казалось бы, используются только 4 битапреобразовать (т. е. 0x0-0xF), а затем они повторяются до 8 бит (т. е. 0x00-0xFF).В результате получается 8-битное изображение с 16 уровнями серого.

Есть какие-нибудь подсказки?Я хотел бы попытаться избежать конвертации вручную, если это возможно.Мне в основном любопытно, почему его преобразование происходит следующим образом.

Редактировать:

Я также использовал проект показан на этой статье с такими же результатами.Я начинаю думать, что нет реальной 8bpp градаций серого (по крайней мере, что касается BMP), и это как-то связано с индексацией.Рассмотрим это позже сегодня и обновим, если что-нибудь новое появится.При использовании этого же проекта TIFF 8bpp, похоже, сохраняются правильно.

1 Ответ

0 голосов
/ 17 ноября 2011

Например, значение FF составляет 4 + 4 = 8 бит. Дело не в том, что для преобразования используются только четыре бита, а байты отображаются в виде шестнадцатеричных цифр, для которых требуется минимум 4 бита. Таким образом, каждый байт данных отображается как две шестнадцатеричные цифры, разделенные пробелами.

Полагаю, каждое значение байта соответствует варианту серого цвета в 256-цветовой шкале. Поэтому, возможно, когда ваше изображение проходит через 256 цветовую шкалу, оно уменьшается до соответствующих 16 серых цветов, а не отдельной 8-битной серой шкалы.

Вы можете прочитать о том, как каждое значение цвета изображения взвешивается в оттенках серого, Здесь & Здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...