|
原帖由 slore 于 2010-3-20 22:49 发表
没有现成的,有现成intel jpeg libray库。
找个时间试下。现学现卖,都是google找
相关函数,自己乱整合的。
既然内核mspaint,干嘛把关联给精简了?
预览,右键都不能直接编辑了。。。
右键关联没注意,有空我把它还原回去
img1.Picture.Assign(Clipboard);
img1.Picture.SaveToFile( "c:\11.jpg ");
delphi的好方便啊...就是delphi出来的程序还是比较大
vb最牛,记得以前老师布置作业,要求写一个算法,两种显示方式,一种是直接运算显示结果,一种是加上延迟,要看到算法的运作过程的效果
结果我用vb写好,没有加任何延迟就“实现”了延迟的效果,直接显示结果没法实现,因为实在是太慢了,最后我想了个办法,不用运算,反正结果是知道的,直接显示给老师看,他也不看代码,只看显示器,顺利通过了
找来找去,好像vc都是只有保存为bmp的源代码,vb和delphi本身有函数,很容易实现
shimgvw.dll应该有相关函数才对啊,貌似vc应该可以直接调用的
以下代码保存剪贴板中的位图到文件
BOOL SaveBitmap(const BITMAP &bm,HDC hDC,HBITMAP hBitmap,LPCTSTR szFileName)
{
int nBitPerPixel = bm.bmBitsPixel;//获得颜色模式
int nW = bm.bmWidth;
int nH = bm.bmHeight;
int nPalItemC=bm.bmPlanes; //调色板项的个数
int nBmpInfSize=sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*nPalItemC;//位图信息的大小
int nDataSize=(nBitPerPixel*nW+31)/32*4*nH;//位图数据的大小
//初始化位图信息
BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + nBmpInfSize;//sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + nDataSize;//文件总的大小
bfh.bfType = (WORD)0x4d42;//位图标志
char * p = new char[nBmpInfSize+nDataSize];//申请内存位图数据空间(包括信息头)
memset(p,0,nBmpInfSize);//将信息头的数据初始化为0
LPBITMAPINFOHEADER pBih = (LPBITMAPINFOHEADER) p;//位图信息头
pBih->biCompression = BI_RGB;
pBih->biBitCount = nBitPerPixel;//每个图元像素使用的位数
pBih->biHeight = nH;//高度
pBih->biWidth = nW;//宽度
pBih->biPlanes = 1;
pBih->biSize = sizeof(BITMAPINFOHEADER);
pBih->biSizeImage = nDataSize;//图像数据大小
char *pData=p+nBmpInfSize;
//DDB转换为DIB
::GetDIBits(hDC,hBitmap,0,nH,pData,(LPBITMAPINFO) pBih, DIB_RGB_COLORS);//获取位图数据
ofstream ofs(szFileName,ios::binary);
if(ofs.fail())
return FALSE;
ofs.write((const char*)&bfh, sizeof(BITMAPFILEHEADER));//写入位图文件头
ofs.write((const char*)pBih, nBmpInfSize);//写入位图信息数据
ofs.write((const char*)pData, nDataSize);//写入位图数据
return TRUE;
}
void main()
{
HWND hWnd=NULL;
::OpenClipboard(hWnd); // 打开剪贴板
HANDLE hBitmap = ::GetClipboardData(CF_BITMAP); // 获取剪贴板数据句柄
if(hBitmap==NULL)
{
return ;
}
HDC hDC = ::GetDC(hWnd); // 获取设备环境句柄
HDC hdcMem = CreateCompatibleDC(hDC); // 创建与设备相关的内存环境
SelectObject(hdcMem, hBitmap); // 选择对象
SetMapMode(hdcMem, GetMapMode(hDC)); // 设置映射模式
BITMAP bm; // 得到位图对象
GetObject(hBitmap, sizeof(BITMAP), &bm);
SaveBitmap(bm,hDC,(HBITMAP)hBitmap,"clip.bmp");
::ReleaseDC(hWnd, hDC); // 释放设备环境句柄
DeleteDC(hdcMem); // 删除内存环境
::CloseClipboard(); // 关闭剪贴板
}
这还有一段,看来很多跟我一样的无聊人
//获取屏幕中指定区域的图
hbitmap cpage1::gethbitmap()
{
int nwidth=m_rectcapture.width();
int nheight=m_rectcapture.height(); //得到鼠标所在处的窗口的区域宽、高
hdc hdcscreen, hmemdc;
hbitmap hbitmap, holdbitmap;
hdcscreen = createdc( //建立一个屏幕设备环境句柄
"display", //用vbnullstring传递null值给该参数,除非:1、用display,是获取整个屏幕的设备场景;2、用winspool,则是访问打印驱动
null, //所用专门设备的名称。该名由打印管理器分配显示
null, //用vbnullstring传递null值给该参数
null //devmode,这个结构保存初始值。用createdcbynum传递0(null)值则适用默认设置
);
hmemdc = createcompatibledc(hdcscreen); //建立一个与屏幕设备环境句柄兼容、与鼠标所在处的窗口的区域等大的位图
hbitmap = createcompatiblebitmap(hdcscreen, nwidth, nheight);
holdbitmap =(hbitmap)selectobject(hmemdc, hbitmap); //把新位图选到内存设备描述表中
bitblt(hmemdc, 0, 0, nwidth, nheight, hdcscreen,m_rectcapture.left,m_rectcapture.top,srccopy); // 把屏幕设备描述表拷贝到内存设备描述表中
hbitmap =(hbitmap)selectobject(hmemdc, holdbitmap); //取回鼠标所在处的窗口屏幕位图的句柄
deletedc(hdcscreen);
deletedc(hmemdc); //不再需要时,该设备场景可用deletedc函数删除。删除前,其所有对象应回复初始状态。
return hbitmap;
}
//保存图片
void cpage1::onlbuttonup(uint nflags, cpoint point)
{
/*-------------------------------------------------*/
m_getwininfo.eraselastwindow();
/*-------------------------------------------------*/
if(this->m_bsavetofile)
this->writebmptofile(this->gethbitmap());
if(this->m_bcopytoclip)
this->copybmptoclipboard(this->gethbitmap());
if(this->m_bopenmspaint)
::shellexecute(null,"open","mspaint.exe",this->m_strfilepath,null,sw_shownormal);
this->stopcapture();
afxgetmainwnd()->showwindow(sw_normal); //恢复窗口显示模式
cpropertypage::onlbuttonup(nflags, point);
}
呵呵,如果比较麻烦就不弄了,nircmd算了,只要不被当成病毒,这个命令行工具还是挺牛的,30k也够小的了
[ 本帖最后由 NicTense 于 2010-3-21 00:27 编辑 ] |
|