vc qr transformar uma handle de imagem
HBITMAP em texto binário certo? pq um arquivo já está em texto binário...
bom, pra isso vamos usar basicamente a função
GetDIBits pra pegar os bits e dps criar uma trexo da memória com tds estruturas necessárias pra armazenar um arquivo bitmap, isso é o ideal se vc quiser salvar um arquivo, mas se vc precisar apenas dos dados (caso queira transferí-lo via sockets por exemplo) vc vai precisar só dos bits e da resolução msm...
vc tbm vai precisar dum
HDC associado com o
HBITMAP, se ñ tiver vc pode criar um assim:
Código:
HDC hDCS,hDCImg;
hDCS = GetDC(0);
hDCImg = CreateCompatibleDC(hDCS);
SelectObject(hDCImg, hBmpImp); //o hBmpImp é o HBITMAP necessário
ReleaseDC(0, hDCS);
d qlqr jeito vamos precisar da resolução tbm, caso ñ a tenha vc pode obtê-la com a função
GetObject assim:
Código:
DWORD dwImgX,dwImgY;
BITMAP bmp;
GetObject(hBmpImg, sizeof(bmp), &bmp);
dwImgX = bmp.bmWidth;
dwImgY = bmp.bmHeight;
Agora sim vamos pegar o mapa de bits, supondo q seja 32bits e tenha apenas um plano:
Código:
BYTE*bits;
BITMAPINFO bi;
ZeroMemory(&bi, sizeof(bi));
bi.bmiHeader.biSize = sizeof(bi.bmiHeader);
bi.bmiHeader.biWidth = dwImgX;
bi.bmiHeader.biHeight = dwImgY;
bi.bmiHeader.biPlanes = 1;
bi.bmiHeader.biBitCount = 32;
bi.bmiHeader.biCompression = BI_RGB;
bi.bmiHeader.biSizeImage = dwImgX * dwImgY * 4; //o 4 representa 32 bits em bytes
bi.bmiHeader.biXPelsPerMeter = 2835; //isso representa 72 dpi horizontal
bi.bmiHeader.biYPelsPerMeter = 2835; //isso representa 72 dpi vertical
bits = (BYTE*)GlobalAlloc(GMEM_FIXED, bi.bmiHeader.biSizeImage);
GetDIBits(hDCImg, hBmpImg, 0, dwImgY, bits, &bi, DIB_RGB_COLORS);
agora temos os bits, se ñ for preciso manter uma estrutura de arquivo isso já basta, mas se vc for escrever num arquivo vc precisa da estrutura
BITMAPFILEHEADER:
Código:
BITMAPFILEHEADER bfh;
ZeroMemory(&bfh, sizeof(bfh));
bfh.bfType = 'MB'; //isso é BM ao contrário, já q os x86 trabalham com little endian (invertem os números)
bfh.bfOffBits = (sizeof(bfh)) + bi.bmiHeader.biSize;
bfh.bfSize = bfh.bfOffBits + bi.bmiHeader.biSizeImage;
agora se vc quiser salvar no arquivo basta salvar respectivamente o conteúdo das variáveis
bfh,
bi.bmiHeader e dps
bits, se for realmente necessário um únicro trexo consecutivo de dados, basta concatenar esses dados assim:
Código:
char*txt;
txt = (BYTE*)GlobalAlloc(GMEM_FIXED, bfh.bfSize);
CopyMemory(txt, &bfh, sizeof(bfh));
CopyMemory(txt + sizeof(bfh), &bi.bmiHeader, bi.bmiHeader.biSize);
CopyMemory(txt + bfh.bfOffBits, bits, bi.bmiHeader.biSizeImage);
eu ainda ñ testei o código xD~ fiz conforme fui lembrando, talvez dê algum erro d conversão d valor ou falte alguma coisa, se vc ñ conseguir se virar volte a postar os problemas...
o/
Tiago