Привет! Подскажите пожалуйста способ конвертации любого изображения в монохромное, используя GDI+. Нижеследующий код оставляет всю картинку без изменения. Я подозреваю, что помимо изменения палитры нужно еще изменить и PixelFormat у объекта Bitmap. Однако, как это сделать (и возможно ли вообще), не знаю.
GLOBALHANDLE hMem;
ColorPalette* palette;
hMem = GlobalAlloc(GHND,(DWORD)sizeof(ColorPalette)+(sizeof(ARGB)*2));
if(hMem)
{
if((palette = (ColorPalette*)GlobalLock(hMem)) != NULL)
{
palette->Count = nSize;
palette->Flags = 0;
palette->Entries[0] = Color::MakeARGB(0,0,0,0);
palette->Entries[1] = Color::MakeARGB(0,0xFF,0xFF,0xFF);
Bitmap* pImage = new Bitmap(L”1.bmp”);
pImage->Setpalette(palette);
pImage->SaveAs(L”2.bmp”);
delete pImage ;
GlobalUnlock(hMem);
GlobalFree(hMem);
}
}
Спасибо!
В принципе ты можешь получить пикселы картинки в нужном формате
Bitmap* bmp = new Bitmap(wPath);
BitmapData* bmpData = new BitmapData;
Rect rect(0, 0, bmp->GetWidth(), bmp->GetHeight());
bmp->LockBits(&rect, ImageLockModeRead, PixelFormat1bppIndexed, bmpData);
PBYTE pixels = (PBYTE)bmpData->Scan0;
а потом создать другую
Bitmap::Bitmap(width, height, format)
и перегнать туда массив
pixels
Здравствуйте visitant, Вы писали:
V>В принципе ты можешь получить пикселы картинки в нужном формате
V>V> Bitmap* bmp = new Bitmap(wPath);
V> BitmapData* bmpData = new BitmapData;
V> Rect rect(0, 0, bmp->GetWidth(), bmp->GetHeight());
V> bmp->LockBits(&rect, ImageLockModeRead, PixelFormat1bppIndexed, bmpData);
V> PBYTE pixels = (PBYTE)bmpData->Scan0;
V>
V>а потом создать другую
V>V>Bitmap::Bitmap(width, height, format)
V>
V>и перегнать туда массив pixels
Спасибо! Но проблема в том, что LockBits возвращает статус InvalidParametr, когда в качестве PixelFormat задается PixelFormat1bppIndexed или PixelFormat4bppIndexed. В остальных случаях все работает — можно получить указатель на массив.