2013-04-07 2 views
1

это мой код:PixelFormat конвертация беда

BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
UnmanagedImage img = new UnmanagedImage(bmpData); 
//MAIN BLOCK 
BayerDithering filter = new BayerDithering(); 
img = new UnmanagedImage(img.ImageData, img.Width, img.Height, img.Stride, PixelFormat.Format8bppIndexed); 
filter.ApplyInPlace(img); 
//END MAIN BLOCK 
bitmap.UnlockBits(bmpData); 

Это результат: screenshot

Почему результат не complited Оо? И что я должен изменить только в категории "MAIN BLOCK"?

+0

У меня есть сомнения, что этот код создает скриншот, который вы указали. Вы используете 'img' и' _img' отдельно. –

+0

извините, это мой провал – GLeBaTi

+0

Вы блокируете его на 24bpp, и ваш фильтр применяет его на 8bpp .. что вы ожидаете от результата? –

ответ

2
img = new UnmanagedImage(..., img.Stride, PixelFormat.Format8bppIndexed); 

Это утверждение, в котором проблема началась. Вы передаете данные пикселя и шаг изображения 24bpp, но лгали и сказали, что это изображение 8bpp. В результате все равно получается изображение 24bpp и полностью запутанный фильтр.

Это не может работать, преобразование с 24bpp в 8bpp гораздо более активно. Изображение 8bpp будет иметь не только формат и шаг в разных пикселях, но также требует таблицу цветов (aka palette). Создание хорошей цветной таблицы с 256 цветами, которая создает разумно соответствующее изображение 8bpp, затруднительно.

Для выполнения этой работы вам понадобится один из классов в пространстве имен AForge.Imaging.ColorReduction.

Смежные вопросы