GDI+ Конвертация картинок
От: Скородумов АС  
Дата: 23.08.02 08:47
Оценка:
Привет! Подскажите пожалуйста способ конвертации любого изображения в монохромное, используя 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);
       }
}


Спасибо!
Re: GDI+ Конвертация картинок
От: visitant Украина  
Дата: 23.08.02 09:45
Оценка:
В принципе ты можешь получить пикселы картинки в нужном формате

  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
Re[2]: GDI+ Конвертация картинок
От: Скородумов АС  
Дата: 23.08.02 12:14
Оценка:
Здравствуйте 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. В остальных случаях все работает — можно получить указатель на массив.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.