/* //方法3 HBITMAP hbm = CreateBitmap( Width, // bitmap width, in pixels Height, // bitmap height, in pixels 1, // number of color planes 1, // number of bits to identify color NULL // color data array ); HDC MDC = ::CreateCompatibleDC(0); HBITMAP oldBmp=(HBITMAP)SelectObject(MDC,hbm); //设定颜色点阵 ::SetDIBits(MDC,hbm,0,Height,Bits,binf,DIB_RGB_COLORS); BitBlt(DescCanvas->Handle,0,0,Width, Height,MDC,0,0,SRCCOPY); ::SelectObject(MDC,oldBmp); ::DeleteObject(hbm); ::DeleteDC(MDC); */ Result = true; } return Result; }
{
GLint viewport[4];
int length,tWidth;
bool Result;
//BITMAPFILEHEADER fHeader;
BITMAPINFOHEADER iHeader;
int bmpFile;
GLint lastBuffer; // Storage for the current read buffer setting
glGetIntegerv(GL_VIEWPORT, viewport); tWidth = viewport[2]*3;
tWidth = (tWidth + 3) & (~3); //4字节对齐
length = tWidth * viewport[3]; if (Bits!=NULL)
delete []Bits;
bitlength=length;
Bits=new unsigned char[length+1];
glFinish(); glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glReadBuffer(GL_BACK);
glReadPixels(0, 0, viewport[2], viewport[3], GL_RGB, GL_UNSIGNED_BYTE, Bits);
ColorsChanged = true;
Width = viewport[2];
Height = viewport[3];
ColorDepth = 24; //对当前的色素交换,
ConvertColors(); if (Bits!=NULL)
{
iHeader.biSize = sizeof(BITMAPINFOHEADER);
iHeader.biWidth = Width;
iHeader.biHeight = Height;
iHeader.biPlanes = 1;
iHeader.biBitCount = ColorDepth;
iHeader.biCompression = BI_RGB;
iHeader.biSizeImage = length;
iHeader.biXPelsPerMeter=0;
iHeader.biYPelsPerMeter=0;
iHeader.biClrImportant=0;
iHeader.biClrUsed=0; struct { BITMAPINFOHEADER bih;
RGBQUAD col[2];
}bic;
bic.col->rgbBlue=0;
bic.col->rgbGreen=0;
bic.col->rgbRed=0;
bic.col->rgbReserved=0;
BITMAPINFO *binf = (BITMAPINFO *)&bic;
memcpy(&(binf->bmiHeader),&iHeader,sizeof(BITMAPINFOHEADER));
/*
// ~~方法1
//这里直接把裸图显示 [不过大图效果很差]
StretchDIBits(DescCanvas->Handle,
0, 0, Width, Height,
0, 0, Width, Height,
Bits, binf, 0, SRCCOPY);
*/
//方法2,创建位图 ,也是模糊
HBITMAP hbm;
char* picData=NULL;
// 从位图头创建一个DIB并取得指向缓冲区的指针。 ~~~图像有时候会创建出错
hbm= CreateDIBSection(0, binf, DIB_RGB_COLORS, (void**)&picData, 0, 0);
//拷贝数据到缓冲区
memcpy(picData,Bits,bitlength);
HDC memDC = CreateCompatibleDC(0);
SelectObject(memDC, hbm);
BitBlt(DescCanvas->Handle,0,0,Width, Height,memDC,0,0,SRCCOPY);
::DeleteObject(hbm);
//Graphics::TBitmap*bmp=new Graphics::TBitmap;
//bmp->Handle=hbm;
//bmp->SaveToFile("d:\\t1.bmp");
//DescCanvas->Draw(-1,-1,bmp);
//delete bmp;
/*
//方法3
HBITMAP hbm = CreateBitmap(
Width, // bitmap width, in pixels
Height, // bitmap height, in pixels
1, // number of color planes
1, // number of bits to identify color
NULL // color data array
);
HDC MDC = ::CreateCompatibleDC(0);
HBITMAP oldBmp=(HBITMAP)SelectObject(MDC,hbm);
//设定颜色点阵
::SetDIBits(MDC,hbm,0,Height,Bits,binf,DIB_RGB_COLORS);
BitBlt(DescCanvas->Handle,0,0,Width, Height,MDC,0,0,SRCCOPY);
::SelectObject(MDC,oldBmp);
::DeleteObject(hbm);
::DeleteDC(MDC);
*/
Result = true;
}
return Result;
}