在EVC怎么保存截图啊?请高手帮忙啊!

cjyun 2004-08-04 09:19:35
我在VC里实现了截图和保存,可是在Evc里,不支持GetDIBits函数(获取该调色板下新的像素值 ),那么,在Wince里怎么实现图像保存?请各位高手帮忙啊!
...全文
367 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
bluebirdboy 2004-08-19
  • 打赏
  • 举报
回复
mark
cjyun 2004-08-16
  • 打赏
  • 举报
回复
谢谢各位指导,特别感谢 nbcool(载舟之水)
载舟之水 2004-08-16
  • 打赏
  • 举报
回复
HBITMAP hOldBitmap1 = (HBITMAP)::SelectObject(memDc, hSourceBitmap);

是因为每次创建memDc时,系统默认会在memDc里面放一个1x1(hOldBitmap1)的位图,
所以你需要先把这个hOldBitmap1替换出来(因为memDc里面只能存在一个同类的GDI对象,刷子,字体等也是一样),等使用完再把hOldBitmap1放回去,不然就可能出现1x1的对象泄漏。
不过,其实只要你不循环调用相关代码也不会泄漏的,操作系统会自动检查进程描述表中1x1位图对象使用计数,发现如果为0,那么就会自动从对象区删除该对象。
载舟之水 2004-08-16
  • 打赏
  • 举报
回复
我的邮箱可以使用,已停用是我为了防止垃圾邮件而自动回复的。

代码已经调试通过了并发给你了。

你也可以把抓下来的图传到PC上验证看看。

因为我平常不使用MFC,所以我懒得用MFC了。你看后直接调用就行了。


主要增加的函数为

HBITMAP CopyScreenToBitmap(HWND hPic,LPRECT lpRect);
BOOL SaveDIBToFile(LPSTR hDib, LPCTSTR szFileName);
LPSTR GettingBits(HBITMAP hSourceBitmap);

我写的几个函数是SDK的,你并不需要关心如何用MFC实现,只要会调用就行了,



另外我去掉了一些其他的东西,方便你阅读,BitBlt 之所以你没成功,是因为你没把它放在OnPaint()里面。


看得出来,你没做过图像处理。

所以给你一些建议,也算是我的一些经验,要学习图像处理,

1.必须深刻理解Windows CE内存管理机制和使用,建议阅读 《Windows CE 程序设计》 一书,目前中文有第一版,英文最新是第三版。

2.必须了解Windows CE操作系统如何管理GDI对象。《Windows 核心编程》。

3.图像格式及编解码知识。
载舟之水 2004-08-15
  • 打赏
  • 举报
回复
nbcool$yeah.net $->@

我不保证能及时回复你。
Thomasyzy 2004-08-15
  • 打赏
  • 举报
回复
nbcool(载舟之水) :
是不是因为DDB是依赖于设备的位图,所以要建立一个独立于设备的位图DIB?
还有HBITMAP hOldBitmap1 = (HBITMAP)::SelectObject(memDc, hSourceBitmap);
这条语句中的hOldBitmap1是做什么用的?(我理解为把memDc中的原来位图放入hOldBitmap1,再把hSourceBitmap选入memDC).
如果要存储位图是不是在BitBlt的语句后面?
非常感谢.
cjyun 2004-08-15
  • 打赏
  • 举报
回复
我发现了是保存位图的问题,因为显示系统原有的位图没有背景色。
cjyun 2004-08-15
  • 打赏
  • 举报
回复
你说用pictue空控键怎么实现啊,你能把你的邮箱留下吗?我把我的代码发给你。
cjyun 2004-08-15
  • 打赏
  • 举报
回复
谢谢了,我用的保存图像和你是一样的啊。太奇怪了
cjyun 2004-08-15
  • 打赏
  • 举报
回复
我发送不了,系统说你的邮箱已停用。我的
QQ:54942472,
msn:cjyun2004@hotmail.com
载舟之水 2004-08-14
  • 打赏
  • 举报
回复
不清楚你说的是不是同一个问题,整理了一下。
看样子你是想显示在窗口上。确定要获得的数据都正确,
再确定你代码放的位置是否正确。



//Put the following code in the case of WM_PAINT
//Or OnPaint() function


CDC MemDC = NULL;
CWnd *pWnd = NULL;
CRect rect = {0,0,0,0};

HBITMAP hSourceBmp = NULL;
HBITMAP hOldSel = NULL;
HBITMAP OldBitmap = NULL;

CClientDC dc(pWnd);
*pWnd = GetDlgItem(IDC_SH);
pWnd->GetClientRect(&rect);
hSourceBmp = SHLoadDIBitmap(lpszFileName);
ASSERT(hSourceBmp);

if(hSourceBmp != NULL)
{
MemDC.CreateCompatibleDC(&dc);
OldBitmap=(HBITMAP)MemDC.SelectObject(hSourceBmp);
//dc.BitBlt(20,20,rect.Width()-20,rect.Height()-20,&MemDC,0,0,SRCCOPY);
//I counld not see the client rect value of your window.
//just test it.
dc.BitBlt(0,0,50,50,&MemDC,0,0,SRCCOPY);

MemDC.SelectObject(OldBitmap);
}
//Delete by youself
DeleteObject(hSourceBmp);

// you should delete MemDC here!
// Release dc here
载舟之水 2004-08-14
  • 打赏
  • 举报
回复
还有颜色那就是图像数据有问题。
不过你提供的内容太少了,而且表达得断断续续,没法分析了。
cjyun 2004-08-14
  • 打赏
  • 举报
回复
这样显示有什么问题啊?为什么显示不出来。
HBITMAP hSourceBmp=SHLoadDIBitmap(lpszFileName);
HBITMAP hOldSel;
CRect rect;//截图的矩形区域
CWnd *pWnd=GetDlgItem(IDC_SH);//获得资源句柄
pWnd->GetClientRect(&rect);
CClientDC dc(pWnd);
ASSERT(hSourceBmp);
HBITMAP OldBitmap;
CDC MemDC;
// CRect rect;
MemDC.CreateCompatibleDC(&dc);
// GetClientRect(rect);
OldBitmap=(HBITMAP)MemDC.SelectObject(hSourceBmp);
///显示它
dc.BitBlt(20,20,rect.Width()-20,rect.Height()-20,&MemDC,0,0,SRCCOPY);
MemDC.SelectObject(OldBitmap);

crazyeagle 2004-08-14
  • 打赏
  • 举报
回复
GZ
cjyun 2004-08-14
  • 打赏
  • 举报
回复
上面的我试了不行
但是我用控键picture的SetBitmap();
没有选Centr image属性
是可以实现的就是有红色的背景色。
用MoveWindows还是有颜色。
太奇怪了。



cjyun 2004-08-13
  • 打赏
  • 举报
回复
显示还是有红色背景色,怎么弄啊!
载舟之水 2004-08-13
  • 打赏
  • 举报
回复
不明白你的意思了,你没有确定问题的所在,也没有源码,看来很难帮上你了 :(
载舟之水 2004-08-10
  • 打赏
  • 举报
回复
如果你确定你的数据没问题得话,居中现实有背景色,这是picture的bug,我说得十分清楚了,只能等下个版本的控件出来。
你直接用BitBlt吧。
cjyun 2004-08-09
  • 打赏
  • 举报
回复
那到底picture控件怎么显示才能没有背景色啊!!
劳烦说清楚点啊
wbcp2000 2004-08-09
  • 打赏
  • 举报
回复
在CE中,有些位图句柄,并不能够得到位图的位内容。例如从资源加载的位图默认是得不到位内容的,而从文件加载的位图,默认是可以得到位内容的。
要想保存位图,应自己来用CreateDIBSection函数来。代码片断如下:

// 创建一个与屏幕设备描述表兼容的位图
//hBitmap = CreateCompatibleBitmap(hScrDC, xScrn, yScrn);
PBYTE pBits = NULL;
BITMAPINFO BInfo;

memset(&BInfo,0,sizeof(BITMAPINFO));
BInfo.bmiHeader.biSize = sizeof(BITMAPINFO);
BInfo.bmiHeader.biWidth = xScrn;
BInfo.bmiHeader.biHeight = yScrn;
BInfo.bmiHeader.biPlanes = 1;
BInfo.bmiHeader.biBitCount = 24;
BInfo.bmiHeader.biCompression = BI_RGB;

hBitmap = CreateDIBSection(
hScrDC,&BInfo,DIB_RGB_COLORS,(void**)&pBits,0,0);
加载更多回复(17)

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧