如何关联Graphics::TBitmap *pBitmap指针到数据内存块?

aluosheng 2003-07-15 11:21:29
事实上我的表述不是很清楚,我不知道该怎么表达我的意思,如下:
我的程序分为两部分,一部分负责生成图,另一部分处理该图。为了节省时间和资源消耗,没有在生成图以后存成磁盘文件,而是以内存中点矩阵的形式存在,简单的说该矩阵存储的是灰度值0-255,矩阵下标即该点在bmp中的坐标;现在我希望一个Graphics::TBitmap *pBitmap能够关联到这样的一个矩阵,这样我可以在后期用 Graphics::TBitmap *pBitmap来操作对该图像进行处理。请问该如何操作?需要对该矩阵增加bmp格式文件头结构做处理吗?
我原来笨的做法是 :
点矩阵+BMP文件头 ,savetofile mytest.bmp;
pBitmap->LoadFromFile mytest.bmp

...全文
393 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jishiping 2003-07-15
  • 打赏
  • 举报
回复
我说的“一点一点”的复制,就包括你说的一次设定一块区域的图像数据,而不是一个点
一个点的复制。
aluosheng 2003-07-15
  • 打赏
  • 举报
回复
to 季头:
我正是按照你说的那样做的,我每次处理一个单位区域,是2500*2500*8bit的那个,要处理n个,n会不会有很大,就要看具体使用者的使用情况了,最大的n*2500*2500*8bit就是我说的那个全图。
我没法“一点一点”的复制,因为DLL是按照要求写好了,只能调用的时候一次性加载一个单位区域的数据。
感谢季头!感谢诸位!
这几天太忙,过段日子结贴给分!!!!!!!
nuaacims 2003-07-15
  • 打赏
  • 举报
回复
我是一点都不懂...实在没话说 学习来的
jishiping 2003-07-15
  • 打赏
  • 举报
回复
不知道你的图像数据是怎么生成的?可以直接将图像数据一点一点的存到Bmp->ScanLine[h]
中,这样就不用先额外new一个内存块了。

你说的300000*300000*8bit大的Bitmap,我认为你的思路有问题。这么大的Bmp,光是创建
就要很长时间了(你不可能同时用到这么大的Bitmap中的所有数据吧)。建议分段读取,用
到哪部分,就生成哪部分的图像,这样速度才会快。
aluosheng 2003-07-15
  • 打赏
  • 举报
回复
阿!季头现身了阿!
to 季头:
是这样的,我的生成图像很大,现在仅仅是处理1个单位区域,是2500*2500*8bit的灰度图,而全图要求 300000*300000*8bit 之大!暂时不考虑机器的限制,我只能力所能及的在有限的内存中做更多的事情,我不能再额外的将会开辟成倍增长的内存了,怎么办?我的本意是能否不用内存复制?仅仅是内存结构操作和指针操作呢?
我刚刚字打到这里,我忽然想起来了,季头你们的方法是可行的,我在内存复制完毕以后立刻释放掉我的点存储矩阵内存文件块,不就行了吗?
季头帮我阿!!!!
感谢!!!!!!
jishiping 2003-07-15
  • 打赏
  • 举报
回复
Bitmap不用从磁盘上读取。可以直接将内存中的数据复制到Bitmap中。比如:

char temp[4+1024];
LOGPALETTE* plp;
Graphics::TBitmap* Bmp;
Bmp = new Graphics::TBitmap;
Bmp->PixelFormat = pf8bit;
Bmp->Width = 256; //换成你自己的图像的宽
Bmp->Height = 256; //换成你自己的图像的高
plp = (LOGPALETTE*)temp;
plp->palVersion = 0x300;
plp->palNumEntries = 256;
memset(plp->palPalEntry, 0, 4*1024);
for(int n=0; n<3; n++)
memset(plp->palPalEntry+n, n, 3);
Bmp->Palette = CreatePalette(plp);
//下面将内存中的图像数据复制到Bmp中
//假设Data中存放的是图像数据
for(int h=0; h<Bmp->Height; h++) {
memcpy(Bmp->ScanLine[h], Data+
Bmp->Width*h, Bmp->Width);
}
aluosheng 2003-07-15
  • 打赏
  • 举报
回复
接上:我最后的点矩阵的形式是一个内存映射文件,获得的是该内存文件的指针,形式如下:

HANDLE hMap;
BYTE *pMap;
hMap=::OpenFileMapping(PAGE_READWRITE,FALSE,"GridMapFile");
//"GridMapFile"是我的存储点矩阵的内存文件名,
pMap=(BYTE*)::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);

pMap就是我要处理的,我如何将其与一个Graphics::TBitmap *pBitmap指针关联起来呢???
恳请高手指教!!!!感谢!!!!!给你分不是错!!!!!
aluosheng 2003-07-15
  • 打赏
  • 举报
回复
to keiy() :
可是前面的部分我已经写成了DLL,设计报告就是这么要求的,在内存里获得一个存储点矩阵的文件指针,后续处理的所有函数都是带有 *pBitmap为参数的,所以我只能一条路走下去了,没有办法再改用SDK的。我的图像生成是8位的,是否要自己操作调色板?感谢五星大将指教!!

to nuaacims(沉底鱼):
上尉你的 ... 是什么意思?一切尽在不言中吗? :-)
nuaacims 2003-07-15
  • 打赏
  • 举报
回复
...
柯本 2003-07-15
  • 打赏
  • 举报
回复
要讲效率,用SDK:
struct BITMAPINFO1
{
BITMAPINFOHEADER bh;
RGBQUAD rgb[256];
} bi;
int i;
unsigned char scanline[192][280];
static BITMAPINFOHEADER ls={sizeof(BITMAPINFOHEADER),280,192,
1,8,BI_RGB,0,0,0,0};

memset(scanline,0x33,192*280); // 你的图像数据
for(i=0;i<256;i++)
{
bi.rgb[i].rgbBlue=rand();
bi.rgb[i].rgbGreen=rand();
bi.rgb[i].rgbRed=rand();
} ;
bi.bh=ls;
StretchDIBits(Canvas->Handle,300,300,-280,-192,0,0,280,192,scanline,(BITMAPINFO*)&bi,DIB_RGB_COLORS ,SRCCOPY );

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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