Usually we come across the situations , where we need to represent the image pixels as an single entity. In VC++ we can make out the image data represented by single entity using its CRgn class provided in MFC.
Bitmap image;//Read from some source, may be you read it from disk or you take it from some other that depends .
int image_width = image.getWidth();
int image_height = image.getHeight();
std::vector vecRect; // vector of rectangles
for(int j = 0; j < image_width; j++)
{
for(int k = 0; k < image_height; k++)
{
int jTranspA = get the alpha value of current pixel(i,j)
if(jTranspA != 0)
{
RECT rct;
rct.left = j;
rct.top = k;
rct.right = j + 1;
rct.bottom = k + 1;
vecRect.push_back(rct);
}
}
}
CRgn rgn;
//size of memory to allocate
DWORD size = vecRect.size() * sizeof(RECT) + sizeof(RGNDATAHEADER);
RGNDATA *rgndata = NULL;
//allocate the memory
rgndata = (RGNDATA *) HeapAlloc( GetProcessHeap(), 0, size);
if(!rgndata)
return;
RECT* pRectInitial = (RECT*)rgndata->Buffer;
RECT rectBounding = vecRect[0];
//feeding the rectangles into the buffer of rgndata
for (int i = 0; i < vecRect.size(); i++)
{
RECT rectCurrent = vecRect[i];
rectBounding.left = min(rectBounding.left, rectCurrent.left);
rectBounding.right = max(rectBounding.right, rectCurrent.right);
rectBounding.top = min(rectBounding.top, rectCurrent.top);
rectBounding.bottom = max(rectBounding.bottom, rectCurrent.bottom);
*pRectInitial = vecRect[i];
pRectInitial++;
}
//preparing rgndata header
RGNDATAHEADER header;
header.dwSize = sizeof(RGNDATAHEADER);
header.iType = RDH_RECTANGLES;
header.nCount = vecRect.size();
header.nRgnSize = vecRect.size() * sizeof(RECT);
header.rcBound.left = rectBounding.left;
header.rcBound.top = rectBounding.top;
header.rcBound.right = rectBounding.right;
header.rcBound.bottom = rectBounding.bottom;
rgndata->rdh = header;
//creating the region from rgndata
rgn.CreateFromData(NULL, size, rgndata);
HeapFree(GetProcessHeap(), 0, rgndata);
//so at the end u have the CRgn object have the informations of pixels presented in image
// note that CRgn object is just a region, it will not have the colour information of the pixels of image.
// you can use this CRgn object , if you want to fill the specific portion in an image with some color ,by taking the graphics of image.