获取屏幕图像,保存成bmp图像,怎样设置被保存文件的位数

liqingyan1980 2003-05-13 02:41:10
源程序如下:
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=GetSystemMetrics(SM_CXSCREEN);
int Height=GetSystemMetrics(SM_CYSCREEN);
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap*pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)GlobalAlloc(GPTR,size);
/////////////////////////////////////////////
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
///////////////////////////////////
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
//////////////////////////////
static int filecount=0;
CString m_Path;

CString name;
name.Format("d:\\pict%04d.bmp",filecount++);
//name=m_Path+name;
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<< 8)|'B');
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
// nCount++;
}
GlobalFree(lpData);

UpdateData(FALSE);

其中:bih.biBitCount=btm.bmBitsPixel;是设置位数的吧,但是不接受整形数
还有看书上说可以压缩保存。就是bih.biCompression=0;这条,可以设置成什么书上没有说。请高手指教。小弟先谢过了
...全文
158 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
liqingyan1980 2003-05-18
  • 打赏
  • 举报
回复
焦急等待中
林仪明 2003-05-15
  • 打赏
  • 举报
回复
up
liqingyan1980 2003-05-14
  • 打赏
  • 举报
回复
楼上的大侠能否告诉我怎么可以行得通(更改文件的保存颜色位数)?十分感谢。
我也是用了压缩算法。压缩效果不错,但速度很慢。慢到一个图像需要10秒钟的程度。所以我想让原始图像小一点。
chegtion 2003-05-14
  • 打赏
  • 举报
回复
彩色图像
bih.biBitCount = (WORD)8?,这样处理肯定行不通。
想从biCompression 入手,得下功夫。
找些现成的压缩软件不行吗?况且你的毕设重点不在于此。
lizhli 2003-05-14
  • 打赏
  • 举报
回复
就是你说的biCompression,不过我没试过:)
liqingyan1980 2003-05-14
  • 打赏
  • 举报
回复
用vc时间不长,请各位高手多多提携,谢谢
liqingyan1980 2003-05-13
  • 打赏
  • 举报
回复
谢谢楼上大哥的帮忙
事情是这样的。我要做一个远程屏幕查看的程序。毕业设计用。我怕jepg库我看不明白,到答辩的时候说不好。我现在把他们保存成bmp文件,然后使用lz77压缩算法压缩。然后传输到监控端。然后解压缩成bmp文件。我使用bmp文件的原因是mfc支持这种文件格式 :(。现在时间比较紧。楼上的大哥说的这些值要赋给哪个变量啊。
lizhli 2003-05-13
  • 打赏
  • 举报
回复
你现在大小是多在?长X宽X8/8+54?那这已经是8位色了
又压缩,网上找些jpeg库,zip库...
lizhli 2003-05-13
  • 打赏
  • 举报
回复
可以设置成以下几种:
#define BI_RGB 0L
#define BI_RLE8 1L
#define BI_RLE4 2L
#define BI_BITFIELDS 3L
RLE是行程编码,00001222可以编成041123(4个0,1个1,3个2),大概这样,具体可能有出入
liqingyan1980 2003-05-13
  • 打赏
  • 举报
回复
程序没有错,可以通过。也能生成图像。只是我想让文件的大小小一点。想来想去只有一个方法:改变bmp文件的颜色位数。怎么改啊
lizhli 2003-05-13
  • 打赏
  • 举报
回复
看错了,收回我的话
lizhli 2003-05-13
  • 打赏
  • 举报
回复
程序有错,GetDIBit中获得的图象数据是长X宽X实际位数,你分配的空间只有长X宽:(
liqingyan1980 2003-05-13
  • 打赏
  • 举报
回复
怎么保存成jpg?vc没有提供这样的类啊
shilong 2003-05-13
  • 打赏
  • 举报
回复
保存成jpg
liqingyan1980 2003-05-13
  • 打赏
  • 举报
回复
高手来看阿
liqingyan1980 2003-05-13
  • 打赏
  • 举报
回复
我的目的是更改保存文件的分辨率和颜色位数。这样能让文件大小变得更小。请各位高手一定帮帮忙。谢谢。焦急等待中……
liqingyan1980 2003-05-13
  • 打赏
  • 举报
回复
谢谢您的回复
我的想法是把这个文件保存成256色的(即八位)的。
写成bih.biBitCount = (WORD)8;或bih.biBitCount = (WORD)8
还是不行。编译能通过,但运行出错。请问这是为什么?
herrycsdn 2003-05-13
  • 打赏
  • 举报
回复
是设置位数
bih.biBitCount = (WORD)btm.bmBitsPixel
biCompression
看看msdn就知道了
bih.biCompression=0说明没有压缩

19,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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