怎么保存成BMP图片??????

wo_deaizainali 2008-03-30 07:09:14
LOCAL @hdc,@memdc,@hbm,@scrwidth,@scrheight:dword
invoke GetSystemMetrics,SM_CXSCREEN
mov @scrwidth,eax
invoke GetSystemMetrics,SM_CYSCREEN
mov @scrheight,eax
invoke CreateDC,CTXT("DISPLAY"),NULL,NULL,NULL
mov @hdc,eax
invoke CreateCompatibleDC,@hdc
mov @memdc,eax
invoke CreateCompatibleBitmap,@hdc,@scrwidth,@scrheight
mov @hbm,eax
invoke SelectObject,@memdc,@hbm
invoke BitBlt,@memdc,0,0,@scrwidth,@scrheight,@hdc,0,0,SRCCOPY

invoke OpenClipboard,NULL
invoke EmptyClipboard
invoke SetClipboardData,CF_BITMAP,@hbm
invoke CloseClipboard
//可以将图片存到剪贴板上了,我现在想存成一副BMP图片,究竟该真么存啊,网上搜索了一下都是VC的东西,究竟应该怎么存成BMP图片啊????
invoke DeleteObject,@hbm
invoke DeleteDC,@memdc
invoke DeleteDC,@hdc
...全文
266 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rularys 2008-03-31
  • 打赏
  • 举报
回复
参考SDK帮助或者MSDN中的
“BITMAPINFOHEADER”和"BITMAPFILEHEADER",非常简单的两个结构。
第二个结构是mbp文件的文件头格式,大体是包含有文件的大小和位图映像的大小以及位图映像在文件中的偏移;
对一个结构是位图映像的信息,大体是包含有位图映像的长、宽,像素格式以及分辨率。
将这两个结构设置好,后面跟上原始的位图映像(就是像素数组),然后保存文件就行了
wo_deaizainali 2008-03-31
  • 打赏
  • 举报
回复
能不能给一个简单的列子啊,我始终建立不起
wo_deaizainali 2008-03-31
  • 打赏
  • 举报
回复
说起到是瞒简单的,我仿照一个C的列子弄成汇编就是显示不出图片来,麻烦各位老大帮我改改

GetDesktop proc uses ebx esi edi
LOCAL @hfile,@hdc,@memdc,@hbm,@scrwidth,@scrheight:dword
LOCAL wBitCount,dwBmBitsSize,dwWritten:dword
LOCAL bmfHdr:BITMAPFILEHEADER
LOCAL bi:BITMAPINFOHEADER
LOCAL lpbi:dword
invoke GetSystemMetrics,SM_CXSCREEN
mov @scrwidth,eax
invoke GetSystemMetrics,SM_CYSCREEN
mov @scrheight,eax
invoke CreateDC,CTXT("DISPLAY"),NULL,NULL,NULL
mov @hdc,eax
invoke CreateCompatibleDC,@hdc
mov @memdc,eax
invoke CreateCompatibleBitmap,@hdc,@scrwidth,@scrheight
mov @hbm,eax
invoke SelectObject,@memdc,@hbm
invoke BitBlt,@memdc,0,0,@scrwidth,@scrheight,@hdc,0,0,SRCCOPY
invoke OpenClipboard,NULL
invoke EmptyClipboard
invoke SetClipboardData,CF_BITMAP,@hbm
invoke CloseClipboard

mov wBitCount,24
invoke RtlZeroMemory,addr bi,sizeof BITMAPINFOHEADER
mov bi.biSize,sizeof BITMAPINFOHEADER
push @scrwidth
pop bi.biWidth
push @scrheight
pop bi.biHeight
push 1
pop bi.biPlanes
push wBitCount
pop bi.biBitCount
push BI_RGB
pop bi.biCompression
mov eax,wBitCount
add eax,31
mul @scrwidth
mov ebx,32
div ebx
mov ebx,4
mul ebx
mul @scrheight
mov dwBmBitsSize,eax
add eax,sizeof BITMAPINFOHEADER
invoke GlobalAlloc,GMEM_FIXED or GMEM_ZEROINIT,eax
mov lpbi,eax
add eax,sizeof BITMAPINFOHEADER
invoke GetDIBits,@hdc,@hbm,0,@scrheight,eax,lpbi,DIB_RGB_COLORS
invoke CreateFile,CTXT("c:\\fsd.bmp"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
mov @hfile,eax
invoke RtlZeroMemory,addr bmfHdr,sizeof BITMAPFILEHEADER
push 4D42h
pop bmfHdr.bfType
mov eax,sizeof BITMAPFILEHEADER
add eax,sizeof BITMAPINFOHEADER
add eax,dwBmBitsSize
push eax
pop bmfHdr.bfSize
mov eax,sizeof BITMAPFILEHEADER
add eax,sizeof BITMAPINFOHEADER
push eax
pop bmfHdr.bfOffBits
invoke WriteFile,@hfile,addr bmfHdr,sizeof BITMAPFILEHEADER,addr dwWritten,NULL
invoke WriteFile,@hfile,lpbi,dwBmBitsSize,addr dwWritten,NULL
invoke GlobalFree,lpbi
invoke CloseHandle,@hfile
invoke DeleteObject,@hbm
invoke DeleteDC,@memdc
invoke DeleteDC,@hdc
ret

GetDesktop endp
cnzdgs 2008-03-30
  • 打赏
  • 举报
回复
然后创建文件(CreateFile),写(WriteFile)文件头、lpbi指向的数据、lpvBits指向的数据,关闭文件(CloseFile)。
cnzdgs 2008-03-30
  • 打赏
  • 举报
回复
用GetDIBits,下面是C/C++的定义,汇编定义应该是在Wingdi.inc里面。
int GetDIBits(
HDC hdc, // handle to DC
HBITMAP hbmp, // handle to bitmap
UINT uStartScan, // first scan line to set
UINT cScanLines, // number of scan lines to copy
LPVOID lpvBits, // array for bitmap bits
LPBITMAPINFO lpbi, // bitmap data buffer
UINT uUsage // RGB or palette index
);
wo_deaizainali 2008-03-30
  • 打赏
  • 举报
回复
我参考了的啊,参考不懂啊.
大熊猫侯佩 2008-03-30
  • 打赏
  • 举报
回复
这个...参考一下C代码的,应该很好转换滴...

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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