如何关联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

...全文
385 10 打赏 收藏 转发到动态 举报
写回复
用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 );
procedure BitmapFileToPNG(const Source, Dest: String); var Bitmap: TBitmap; PNG: TPNGObject; begin Bitmap := TBitmap.Create; PNG := TPNGObject.Create; {In case something goes wrong, free booth Bitmap and PNG} try Bitmap.LoadFromFile(Source); PNG.Assign(Bitmap); //Convert data into png PNG.SaveToFile(Dest); finally Bitmap.Free; PNG.Free; end end; Converting from PNG file to Windows bitmap file The above inverse. Loads a png and saves into a bitmap procedure PNGFileToBitmap(const Source, Dest: String); var Bitmap: TBitmap; PNG: TPNGObject; begin PNG := TPNGObject.Create; Bitmap := TBitmap.Create; {In case something goes wrong, free booth PNG and Bitmap} try PNG.LoadFromFile(Source); Bitmap.Assign(PNG); //Convert data into bitmap Bitmap.SaveToFile(Dest); finally PNG.Free; Bitmap.Free; end end; Converting from TImage to PNG file This method converts from TImage to PNG. It has full exception handling and allows converting from file formats other than TBitmap (since they allow assigning to a TBitmap) procedure TImageToPNG(Source: TImage; const Dest: String); var PNG: TPNGObject; BMP: TBitmap; begin PNG := TPNGObject.Create; {In case something goes wrong, free PNG} try //If the TImage contains a TBitmap, just assign from it if Source.Picture.Graphic is TBitmap then PNG.Assign(TBitmap(Source.Picture.Graphic)) //Convert bitmap data into png else begin //Otherwise try to assign first to a TBimap BMP := TBitmap.Create; try BMP.Assign(Source.Picture.Graphic); PNG.Assign(BMP); finally BMP.Free; end; end; //Save to PNG format PNG.SaveToFile(Dest); finally PNG.Free; end end;

13,824

社区成员

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

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