Пусть я, например, хочу свести изображение к градациям серого.
Пишу такую фукнцию
void Filters::ToGray(System::Drawing::Bitmap* bmp)
{
int w = bmp->Width;
int h = bmp->Height;
int x, y;
BitmapData* bmpData;
bmpData = bmp->LockBits (System::Drawing::Rectangle(0, 0, w, h),
ImageLockMode::ReadWrite,
PixelFormat::Format24bppRgb);
char* p = (char*)bmpData->Scan0.ToPointer();
char gray;
int nOffset = bmpData->Stride - 3*w;
for(y = 0; y < h; ++y, p += nOffset)
{
for(x = 0; x < w; ++x, p += 3)
{
char r = p[2];
char g = p[1];
char b = p[0];
gray = char(0.3*r + 0.59*g + 0.11*b);
p[0] = p[1] = p[2] = gray;
}
}
bmp->UnlockBits(bmpData);
}
в неё передается Bitmap, который хранится в памяти. В обработчике формы OnPaint стоит
e->Graphics->DrawImage(m_Bitmap, 0, 0, m_Bitmap->Width, m_Bitmap->Height);
На выходе получаю картинку плохого качества.Т.е., это явно не gray-scale, там палитра серго явно меньше.
Отсюда вопрос, что я неправильно сделал?