#pragma comment(lib, "Gdiplus.lib") #include #include using namespace Gdiplus; bool GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num, size; Gdiplus::GetImageEncodersSize(&num, &size); Gdiplus::ImageCodecInfo* pImageCodecInfo = (Gdiplus::ImageCodecInfo*)(malloc(size)); Gdiplus::GetImageEncoders(num, size, pImageCodecInfo); bool found = false; for (UINT ix = 0; !found && ix < num; ++ix) { if (0 == _wcsicmp(pImageCodecInfo[ix].MimeType, format) == 0) { *pClsid = pImageCodecInfo[ix].Clsid; found = true; } } free(pImageCodecInfo); return found; } struct Pixel { unsigned int a:8;//8bit unsigned int r:8; unsigned int g:8; unsigned int b:8; }; struct PixelTMP { int a; int r; int g; int b; }; Pixel Convert(DWORD pxl) { Pixel pixel; BYTE *p; p=(BYTE*)&pxl; pixel.a=p[3]; pixel.r=p[2]; pixel.g=p[1]; pixel.b=p[0]; return pixel; } Pixel RGBtoHSV(Pixel pxl) { PixelTMP pixel; pixel.a=255; int minimum,maximum,delta; minimum=min(pxl.r, min(pxl.g, pxl.b)); maximum=max(pxl.r, max(pxl.g, pxl.b)); delta=maximum-minimum; pixel.b=maximum; //r=H, g=S, b=V if (pixel.b==0) pixel.g=0; else pixel.g=delta*(255/pixel.b); if (pixel.g==0) pixel.r=0; else { if (maximum==pxl.r) pixel.r=60*(pxl.g-pxl.b)/delta; else if (maximum==pxl.g) pixel.r=120+60*(pxl.b-pxl.r)/delta; else if (maximum==pxl.b) pixel.r=240+60*(pxl.r-pxl.g)/delta; if (pixel.r<0) pixel.r+=360; //pixel.r hat noch einen Wertebereich von 0..360 //darum jetzt auf 0..255 normieren pixel.r=pixel.r*255/360; } Pixel rp; rp.a=pixel.a; rp.r=pixel.r; rp.g=pixel.g; rp.b=pixel.b; return rp; } inline DWORD GetPxl(void *Scan0,int Stride,int x,int y) { DWORD *pxl; pxl=(DWORD*)(Scan0) + (y * Stride) + (x * 4); return *pxl; } inline void SetPxl(void *Scan0,int Stride,int x,int y,Pixel np) { DWORD *pxl; pxl=(DWORD*)(Scan0) + (y * Stride) + (x * 4); DWORD pixel=(((np.a<<24)&0xff000000)|(np.r<<16)|(np.g<<8)|np.b); *pxl=pixel; } int main() { GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); Bitmap bmp(L"D:\\Downloads\\bg.png"); int w,h; w=bmp.GetWidth(); h=bmp.GetHeight(); /*Rect rect(0,0,w-1,h-1); int flag=ImageLockMode::ImageLockModeUserInputBuf; BitmapData *data=new BitmapData(); UINT *pxls=new UINT[w,h]; data->Width=w-1; data->Height=h-1; data->PixelFormat=PixelFormat32bppARGB; data->Scan0=pxls; data->Stride=4*data->Width; bmp.LockBits(&rect,1,PixelFormat32bppARGB,data);*/ for (/*unsigned */int y=1; yScan0,data->Stride,x,y); DWORD pixel=pxl.GetValue();// Pixel rgb=Convert(pixel); Pixel hsv=RGBtoHSV(rgb); //ab hier gehts mit der Bildverarbeitung los! Color c(hsv.a,hsv.r,hsv.r,hsv.r);// bmp.SetPixel(x,y,c);//SetPxl(data->Scan0,data->Stride,x,y,hsv); // } } //bmp.UnlockBits(data); //delete pxls; //DeleteFile("D:\\Downloads\\zbgnew.png"); CLSID clsid; GetEncoderClsid(L"image/png",&clsid); bmp.Save(L"D:\\Downloads\\zbgnew.png",&clsid); bmp.~bmp(); GdiplusShutdown(gdiplusToken); exit(0); return 0; }