救命啊!下面VC代码(位图数据保存为BMP文件)如何用DELPHI实现?在线等

wukang 2003-08-28 11:49:28
已有位图数据,8位灰度,将数据加上BMP文件头保存到文件中。问用DELPHI如何实现?
void CComCtrl::GetPicture(LPWSTR lpwEncapsulateData, DWORD dwEncapsulateDataLen)
{
lpwEncapsulateData += 2;
dwEncapsulateDataLen -= 6;

std::auto_ptr<BITMAPINFO> pBitmapInfo (new BITMAPINFO);
BITMAPFILEHEADER BFH;
::FillMemory((PVOID)&BFH, (DWORD)sizeof(BITMAPFILEHEADER) ,0);

CFileDialog FileDialog( FALSE,"bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"摄像机图像文件(*.bmp)|*.bmp||",NULL);
if(FileDialog.DoModal()==IDOK)
{
CFile ToFile;
BeginWaitCursor();
BFH.bfType = 0x4d42;//文件头内容
BFH.bfSize = 0x051036;
BFH.bfOffBits = 0X036;

pBitmapInfo->bmiHeader.biSize = 0x028;
pBitmapInfo->bmiHeader.biWidth = 0x0180;
pBitmapInfo->bmiHeader.biHeight = 0x0120;
pBitmapInfo->bmiHeader.biPlanes = 0x01;
pBitmapInfo->bmiHeader.biBitCount = 0x018;
pBitmapInfo->bmiHeader.biCompression = 0;
pBitmapInfo->bmiHeader.biSizeImage = 0x051000;
pBitmapInfo->bmiHeader.biXPelsPerMeter = 0x0ec4;
pBitmapInfo->bmiHeader.biYPelsPerMeter = 0x0ec4;//文件头内容结束

if( ToFile.Open( FileDialog.GetPathName(),CFile::modeCreate|CFile::modeReadWrite ) )
{
ToFile.Write(&BFH, sizeof( BITMAPFILEHEADER ));
if(pBitmapInfo->bmiHeader.biHeight>0)
pBitmapInfo->bmiHeader.biHeight=0-pBitmapInfo->bmiHeader.biHeight;
//使图像倒过来

ToFile.Write(&pBitmapInfo->bmiHeader, sizeof (BITMAPINFOHEADER));

for(int i = 0; i < (int)(dwEncapsulateDataLen/2); i++ )
{//对返回的384*288个图像数据灰度进行存储。
BYTE ucGrey = ((*(lpwEncapsulateData+i))>>8);
for(int j=0;j<3;j++)
ToFile.Write(&ucGrey, sizeof(BYTE));
ucGrey = LOBYTE(*(lpwEncapsulateData+i));
for(j=0;j<3;j++)
ToFile.Write(&ucGrey, sizeof(BYTE));
}
ToFile.Close();
}
EndWaitCursor();
}
...全文
55 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wukang 2003-08-28
  • 打赏
  • 举报
回复
delphi如何转,望告知

LPWSTR lpwEncapsulateData,//打包的数据
DWORD dwEncapsulateDataLen//数据长度
上海老李 2003-08-28
  • 打赏
  • 举报
回复
不是必须用这个转吧,有DELPHI自己的
wukang 2003-08-28
  • 打赏
  • 举报
回复
在线等着救命啊,可从别的贴子中送分
wukang 2003-08-28
  • 打赏
  • 举报
回复
搞定了,楼上的朋友多谢先。
reedseutozte 2003-08-28
  • 打赏
  • 举报
回复
我不知道delphi中如何已枝地址,获取变量,其他我搞定了
不过建议你把这个函数作成dll给delphi调用
var
BFH: BITMAPFILEHEADER;
pBitmapInfo: BITMAPINFO;
ToFile: TFileStream;
ucGrey: BYTE;
i, J: Integer;
begin
lpwEncapsulateData := lpwEncapsulateData + 2;
dwEncapsulateDataLen := dwEncapsulateDataLen - 6;

FillMemory(@BFH, sizeof(BITMAPFILEHEADER), 0);

if SaveDialog1.Execute then
begin
Cursor := crAppStart;
BFH.bfType := $4D42; //文件头内容
BFH.bfSize := $051036;
BFH.bfOffBits := $036;

pBitmapInfo.bmiHeader.biSize := $028;
pBitmapInfo.bmiHeader.biWidth := $0180;
pBitmapInfo.bmiHeader.biHeight := $0120;
pBitmapInfo.bmiHeader.biPlanes := $01;
pBitmapInfo.bmiHeader.biBitCount := $018;
pBitmapInfo.bmiHeader.biCompression := 0;
pBitmapInfo.bmiHeader.biSizeImage := $051000;
pBitmapInfo.bmiHeader.biXPelsPerMeter := $0EC4;
pBitmapInfo.bmiHeader.biYPelsPerMeter := $0EC4; //文件头内容结束

ToFile.Create(SaveDialog1.FileName, fmCreate);
ToFile.Write(BFH, sizeof(BFH));
if (pBitmapInfo.bmiHeader.biHeight > 0) then
pBitmapInfo.bmiHeader.biHeight := 0 - pBitmapInfo.bmiHeader.biHeight;
//使图像倒过来
ToFile.Write(pBitmapInfo.bmiHeader, sizeof(pBitmapInfo.bmiHeader));
for i := 0 to floor(dwEncapsulateDataLen / 2 - 1) do
//对返回的384*288个图像数据灰度进行存储。
begin
ucGrey := (@(lpwEncapsulateData + i) shr 8);
for j := 0 to 2 do
ToFile.Write(ucGrey, 1);
ucGrey := LOBYTE((lpwEncapsulateData + i));
for j := 0 to 2 do
ToFile.Write(ucGrey, 1);
end;
ToFile.Destroy;
end;
Cursor := crDefault;
end;
IORILI 2003-08-28
  • 打赏
  • 举报
回复
学习 up
xz1980 2003-08-28
  • 打赏
  • 举报
回复
你使用DELPHI的TBitmap.
MicroDraw图形控件最新版本 最新版本详情咨询:VX:zhangty426 MicroDraw SDK For Windows,支持windows9x/ME/XP/7/8 发行方式:单机版、开发版本、网络版、B/S版本; MicroDraw图形控件是国内专业图形组件(中间件),兼容多种CAD/GIS文件格式和操作方式; MDF,DWG,DXF,DWF,DXB,DGN,QCD,IGS,MDF,PLT,HPGL,MIF。并提供500多种方法和属性供开发者调用。可以用于开发行业(CAD/GIS/GPS)软件(如:建筑CAD,机械CAD,服装CAD等),数据加工软件(CAD/CNC)(如:线切割软件,激光打标软件),管理软件(MIS/PDM/ERP/MRP2/CAPP,图档管理),监控系统(煤矿,电力,电讯,煤气,消防等行业) 运行环境: 操作系统:Windows 9x/me/nt/2k/xp /win7/8 WinServer2003/2008 编程语言:Viusal Basic/Viusal C++/Delphi/ASP/IE/Powerbuild/Viusal Foxpro/C++ Builder/.NET(vb.net c# vc.net)/易语言 文件管理功能: 1. 支持的文件格式包括:BMP、GIF、ICO、TGA、PCX、WBMP、WMF、JPEG、PNG、MNG、TIFF、JBIG、PNM,PPM,PGM、RAS,DXF ,DWF(4.0-6.0)、DWG(2.5-2014) 、IGS, PDF、MIF,PLT,PRN,HPGL/HPGL2、DGN, SHP,CGM; 2. 打开图形图像文件;支持从URL/ftp网上打开,可以将文件保存到ftp上; 3. 打印文件:全部打印和选择打印,打印预览, 打印到文件; 4. 保存和读取自定义格式文件; 5. 将矢量图以指定的尺寸保存为光珊图或者复制到系统粘贴板上; 6. 插入OLE对象,OFFICE文档。 7. 支持模型及其布局文件的浏览。 8. 在不打开文件的情况下,导入文件的某个图层; 9. 对比文件; 10. 支持FTP服务器文件的导入;. 11. 支付PDF文件的浏览和打印; 12. 设置缺省文件格式模式的显示; 打印功能: 1. 直接对当前文件进行打印; 2. 单单的打印框选的元素; 3. 预览打印; 4. 打印出图时附加打印公司标示及其文本信息; 5. 设置水印并在出图时打印水印; 显示功能: 1. 显示平移,自由缩放,框选放大,最佳显示; 2. 回溯显示; 3. 支持显示透明命令操作; 4. 支持三维文件格式显示; 5. 鸟瞰,鹰眼,放大镜功能; 6. 显示网格,显示十字光标; 7. 显示元素外框控制点,同时通过元素控制点对元素进行控制放大、缩小、旋转; 8. 显示或者隐藏元素,图层元素; 9. 设置背景图片 10. 自定义图库文件。 11. 右键菜单功能; 12. 增加了显示水印功能 13. 显示或者隐藏工具条中的指定按钮; 支持事件 1. 支持鼠标移动、点击、双击及滚轮操作事件; 2. 支持键盘的按下、抬起事件; 3. 支持显示绘制事件,用户可以自定义元素显示样式; 4. 支持多种缺省工具操作事件,缺省工具对元素进行操作都会触发相应事件; 5. 保存、打开、打印文件触发相应事件; 6. 文件上传和下载触发相应事件; 7. 选择操作后会触发相应事件; 元素支持功能: 1. 点;直线,折线,射线;圆,圆弧;椭圆,椭圆弧;样条线;函数曲线;填充区域,位图填充;多义线,文字,轨迹文字,剖面线; 2. 文字标注,尺寸标注(水平,竖直,对齐,角度,半径,直径尺寸等); 3. 块插入、图片插入、OLE对象; 4. 多边形; 5. 基本三维元素创建; 6. 图层、文字样式、尺寸样式、线型、剖面线填充样式等; 编辑构造功能: 1. 删除、复制、粘贴、镜像、移动、旋转、延伸、修剪、拖拽、缩放、圆形阵列、矩形阵列; 2. undo /redo 3. 组合、炸开;炸开文字; 其他可选模块: 1. 算法模块,计算图形的长度、面积、体积、交点等; 寻找最大封闭区域、最小 封闭区域、偏移元素;有限元分析算法;图形比较算法;区域求交算法等; 2.数控加工模块,提取几何元素加工数据;优化加工路径; 3.图库功能,自定义图库; 4.视频测绘模块,将cad图纸和视频内容进行叠加比对;

5,387

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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