之前在网上搜了,找到一个将bmp转为jpg的函数,然后试了,行.然后自己能截屏到bmp.于是,我先将屏幕截为bmp临时格式,然后利用网上搜的函数将bmp格式的文件转化为jpg,这样做确实可以,但接着来的问题是,当我再次截屏的时候,我仍保存为前面的bmp临时文件,名字一样(因为我只想保留一幅临时的bmp图片,不然还有很多的bmp图片),但是不幸的是后来截得图片冲不了前面的临时bmp图片,导致每次出来的jpg图片都是一样的.这个方法我觉得行不通后,决心换一个直接将屏幕截为jpg的函数,但试了后结果是截出来的图片全是一片黑.似乎也不行了.哪位能帮我解决上面的问题啊?备注:我做的是将Activex嵌入到网页,而这个Activex实现的功能就是将屏幕截屏为jpg格式.
------------------------------------
你截屏的代码里怎么写的?和原来一样的文件名,难道不能覆盖?
void CPrintScreenEx3Ctrl::PrintScreenEx(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your dispatch handler code here
// TODO: Add your dispatch handler code here
// TODO: Add your dispatch handler code here
GdiplusStartup(&g_pGdiToken, &g_Gdiplus, NULL); PrintScreenToMemEx();
SaveBmpToDiskEx(); CString lpFileName;
CFileDialog fileDlg(FALSE); fileDlg.m_ofn.lpstrTitle = _T("保存图片对话框");
fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.jpg)\0*.jpg\0All Files(*.*)\0*.*\0\0");
fileDlg.m_ofn.lpstrDefExt = _T("jpg");
if(IDOK == fileDlg.DoModal())
{
lpFileName = fileDlg.GetPathName();
}
Bitmap* pBmp = Bitmap::FromFile(_T("D:\\temp.bmp"));
if (pBmp)
{
CLSID clsid;
int nQuality = 95;
EncoderParameters Encoders;
Encoders.Count = 1;
Encoders.Parameter[0].Guid = EncoderQuality;
Encoders.Parameter[0].Type = EncoderParameterValueTypeLong;
Encoders.Parameter[0].NumberOfValues = 1;
Encoders.Parameter[0].Value = &nQuality;
GetCodecClsid(L"image/jpeg", &clsid);
pBmp->Save(lpFileName, &clsid, &Encoders);
}
GdiplusShutdown(g_pGdiToken);
}void CPrintScreenEx3Ctrl::PrintScreenToMemEx(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your dispatch handler code here
// TODO: Add your dispatch handler code here
// TODO: Add your dispatch handler code here
int x = GetSystemMetrics(SM_CXFULLSCREEN);
int y = GetSystemMetrics(SM_CYFULLSCREEN);
CRect rect(0, 0, x, y);
LPRECT lpRect = ▭
BOOL bSave = TRUE;
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 确保选定区域不为空矩形
if (IsRectEmpty(lpRect))
return;
//为屏幕创建设备描述表
hScrDC = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 获得选定区域坐标
nX = lpRect->left;
nY = lpRect->top;
nX2 = lpRect->right;
nY2 = lpRect->bottom;
//确保选定区域是可见的
if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > 10000)
nX2 = 200;
if (nY2 > 10000)
nY2 = 200;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中 BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY); hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//得到屏幕位图的句柄
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄m_hBitmapEx = hBitmap;
}void CPrintScreenEx3Ctrl::SaveBmpToDiskEx(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: Add your dispatch handler code here
// TODO: Add your dispatch handler code here
// TODO: Add your dispatch handler code here
CString TempFilePath(_T("D:\\temp.bmp")); //CFileDialog fileDlg(FALSE); //fileDlg.m_ofn.lpstrTitle = _T("保存图片对话框");
//fileDlg.m_ofn.lpstrFilter = _T("Text Files(*.jpg)\0*.bmp\0All Files(*.*)\0*.*\0\0");
//fileDlg.m_ofn.lpstrDefExt = _T("bmp");
//if(IDOK == fileDlg.DoModal())
//{
// TempFilePath = fileDlg.GetPathName();
//} HBITMAP hBitmap = m_hBitmapEx;
HDC hDC; //设备描述表
int iBits; //当前显示分辨率下每个像素所占字节数
WORD wBitCount; //位图中每个像素所占字节数 //定义调色板大小, 位图中像素字节大小 ,位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0;
DWORD dwBmBitsSize;
DWORD dwDIBSize, dwWritten; BITMAP Bitmap; //位图属性结构
BITMAPFILEHEADER bmfHdr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构 HANDLE fh, hDib, hPal,hOldPal=NULL; //定义文件,分配内存句柄,调色板句柄 //计算位图文件每个像素所占字节数
hDC = CreateDC(_T("DISPLAY"),NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) *
GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else if (iBits <= 32)
wBitCount = 32; //计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (wBitCount) *sizeof(RGBQUAD); //设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0; dwBmBitsSize = ((Bitmap.bmWidth *
wBitCount+31)/32)* 4
*Bitmap.bmHeight ; //为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi; // 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
} // 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(BITMAPINFO*)lpbi, DIB_RGB_COLORS); //恢复调色板
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
} //创建位图文件
fh = CreateFile(TempFilePath, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return; // 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof
(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)
+ dwPaletteSize; // 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER),
&dwWritten, NULL); // 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
&dwWritten, NULL); //清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
return;
}
int CPrintScreenEx3Ctrl::GetCodecClsid(const WCHAR* format, CLSID* pClsid)
{
UINT codenum = 0;
UINT size = 0;
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&codenum, &size);
if(size == 0)
return -1 ;
pImageCodecInfo = new ImageCodecInfo[size];
if(pImageCodecInfo == NULL)
return -1;
GetImageEncoders(codenum, size, pImageCodecInfo);
for(UINT j = 0; j < codenum; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
delete []pImageCodecInfo;
return 0;
}
}
delete []pImageCodecInfo;
return -1;
}
{ //获取应用程序颜色缓冲区数组
GLubyte* frameData=(GLubyte*)malloc(wndWidth*wndHeight*3);
glReadPixels(0,0,wndWidth,wndHeight,GL_RGB,GL_UNSIGNED_BYTE,frameData); //创建IplImage结构 并指定结构头为适当格式 IplImage* SnapImage=cvCreateImageHeader(cvSize(wndWidth,wndHeight),IPL_DEPTH_8U,3); //将刚创建的IplImage结构的DATA数据指针指向之前获取到的缓冲区数组
cvSetData( SnapImage, frameData,wndWidth*3); //由于opencv里颜色data存放的特点 这里要进行下上下翻转
cvFlip( SnapImage, SnapImage, 0 );//上下翻转 //这里要进行下RGB-BGR的转换...
cvCvtColor( SnapImage, SnapImage,CV_RGB2BGR); //转格式 //保存图片
time_t t = time(0);
char strTime[64];
ZeroMemory(strTime,sizeof(strTime));
strftime(strTime , 64, "%Y%m%d%H%M%S",localtime(&t) );
strcat(strTime,".jpg");//保存为年月日时分秒.jpg
cvSaveImage(strTime,SnapImage); //释放内存 cvReleaseImage(&SnapImage);
free(frameData);
}
OPENCV