社区
C++ Builder
帖子详情
怎么才能把当前屏幕的图像截下来,并存成JPG文件,请各位大侠指教
Lo
2000-11-29 03:51:00
加精
知道的,能给出个例子吗?本人将不慎感缴。
...全文
178
7
打赏
收藏
怎么才能把当前屏幕的图像截下来,并存成JPG文件,请各位大侠指教
知道的,能给出个例子吗?本人将不慎感缴。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
BCB
2000-12-21
打赏
举报
回复
ok!
鼠标移到带 下画线的别名下面就直接看到了EMAIL。
Lo
2000-11-30
打赏
举报
回复
BCB,谢谢!
能告诉我你的联系方式吗?OICQ、Email。以后有机会请你多多指教!
BCB
2000-11-29
打赏
举报
回复
要求C++BUILDER 5.0或DELPHI5.0;
4.0未试过,可能要安装jpeg有关库
BCB
2000-11-29
打赏
举报
回复
C++BUILDER比VC++简单就在这里。
C++BUILDER只要10几行。
BCB
2000-11-29
打赏
举报
回复
// 下面简单有效
#include "jpeg.hpp"
void SaveDesktop(char *jpeg)
{
RECT r;
GetWindowRect(GetDesktopWindow( ),&r);
TCanvas *Canvas0=new TCanvas;
Canvas0->Handle=GetDC(0);
Graphics::TBitmap *bitmap=new Graphics::TBitmap( );
bitmap->Height=r.bottom;
bitmap->Width=r.right;
bitmap->Canvas->CopyRect(r,Canvas0,r);
TJPEGImage *j=new TJPEGImage();
j->CompressionQuality=50; // 失真度
j->Assign(bitmap);
j->SaveToFile(jpeg);
delete j;
delete bitmap;
delete Canvas0;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SaveDesktop("c:\\test.jpg");
}
//---------------------------------------------------------------------------
BCB
2000-11-29
打赏
举报
回复
// 下面简单有效
#include "jpeg.hpp"
void SaveDesktop(char *jpeg)
{
RECT r;
GetWindowRect(GetDesktopWindow(),&r);
TCanvas *Canvas0=new TCanvas;
Canvas0->Handle=GetDC(0);
Graphics::TBitmap *bitmap=new Graphics::TBitmap();
bitmap->Height=r.bottom;
bitmap->Width=r.right;
bitmap->Canvas->CopyRect(r,Canvas0,r);
TJPEGImage *j=new TJPEGImage();
j->CompressionQuality=50; // 失真度
j->Assign(bitmap);
j->SaveToFile(jpeg);
delete j;
delete bitmap;
delete Canvas0;
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SaveDesktop("c:\\test.jpg");
}
//---------------------------------------------------------------------------
Searph
2000-11-29
打赏
举报
回复
以下是抓屏并保存为BMP的代码,其中第二个函数是抓取当前最前面的窗口,你还要改一下,忘了限制不要超出当前屏幕大小,存成jpg就自己想办法吧:
HBITMAP CopyScreenToBitmap()
{
HDC hScrDC, hMemDC;
HBITMAP hBitmap, hOldBitmap;
int nX, nY, nX2, nY2;
int nWidth, nHeight;
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hScrDC);
nX = 0;
nY = 0;
nX2 = GetDeviceCaps(hScrDC, HORZRES);
nY2 = GetDeviceCaps(hScrDC, VERTRES);
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);
// 返回位图句柄
return hBitmap;
}
HBITMAP CopyWindowToBitmap()
{
HDC hScrDC, hMemDC;
HBITMAP hBitmap, hOldBitmap;
int nX, nY, nX2, nY2;
int nWidth, nHeight;
HWND hWndCurrent = GetForegroundWindow();
RECT rect;
GetWindowRect(hWndCurrent, &rect);
hScrDC = GetWindowDC(hWndCurrent);
hMemDC = CreateCompatibleDC(hScrDC);
nX = rect.left;
nY = rect.top;
nX2 = rect.right;
nY2 = rect.bottom;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, 0, 0, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
}
int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄
{ //lpFileName 为位图文件名
HDC hDC;
//设备描述表
int iBits;
//当前显示分辨率下每个像素所占字节数
WORD wBitCount;
//位图中每个像素所占字节数
//定义调色板大小, 位图中像素字节大小 , 位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0,
dwBmBitsSize,
dwDIBSize, dwWritten;
BITMAP Bitmap;
//位图属性结构
BITMAPFILEHEADER bmfHdr;
//位图文件头结构
BITMAPINFOHEADER bi;
//位图信息头结构
LPBITMAPINFOHEADER lpbi;
//指向位图信息头结构
HANDLE fh, hDib, hPal,hOldPal=NULL;
//定义文件,分配内存句柄,调色板句柄
//计算位图文件每个像素所占字节数
hDC = CreateDC("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 = (1 << 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(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if(fh == INVALID_HANDLE_VALUE)
return FALSE;
// 设置位图文件头
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 dwWritten;
}
android
屏幕
录像实现过程
本文介绍了在Android上实现
屏幕
录像的过程,包括FFMPEG的移植、
截
图获取
屏幕
帧和生
成
视频
文件
的步骤。面临的问题包括CPU开销大、图片转换视频时间长。提出了解决方案,如边
截
取边转换、减小图片质量,以及直接使用ffmpeg处理/dev/graphics/fb0流数据,但遇到了fb0无流数据的挑战。期待探讨更优的性能解决方案。
一款不错的
图像
处理软件(含源码)
博客分享了一款基于Java编写的
图像
处理软件,包含源码,支持
图像
放大、缩小、灰度处理、二值化、边缘检测等功能。作者提供了JAR和EXE格式的可执行
文件
以及源码下载链接,适用于学习和进一步开发。软件还实现了Huffman编码,支持多种
图像
格式,并具有丰富的
图像
处理效果。
vfp的一款图片处理库,简洁好用,免费不收钱,值得推荐
博客介绍了木瓜
大侠
开发的MyImg.fll图片处理库,该库免费且易于使用,支持
屏幕
抓取、
图像
裁剪、缩放、旋转、格式转换等功能。通过提供的代码示例,展示了如何利用这个库进行
图像
操作,如打开
图像
、调整大小、保存为不同格式,并能将
图像
内容复制到剪贴板,甚至直接存入数据库。此外,还涉及到了灰度处理和多帧
图像
的操作。
原创
图像
处理软件(含源码)
一款用纯Java语言编写的
图像
处理软件,支持多种图片格式,具备
图像
放大、缩小、灰度直方图显示、
图像
二值化等功能。源代码可自由复制、传播。
Atitit gui控件定位解决方案
本文介绍了几种Atititgui控件定位方法,包括使用AutoIt的UDF开发找图功能,利用AutoHotkey的ImageSearch进行
屏幕
图像
搜索,并探讨了Java结合OpenCV进行模板匹配的可能性。
C++ Builder
13,874
社区成员
102,696
社区内容
发帖
与我相关
我的任务
C++ Builder
C++ Builder相关内容讨论区
复制链接
扫一扫
分享
社区描述
C++ Builder相关内容讨论区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章