我的代码如下,这是个为了说明问题而简单写的代码。
我发现,将Image控件的宽度和高度设置的稍微大一点,那么在Draw时,便会出现“存储空间不足,无法处理此命令”的错误。
前段时间写一个GUI程序,类似地图一类的东西,将众多工程图片数据一次性显示在Image中。但出现了这个问题,Image不能设置的太高和太宽。为此我尝试了另外一种方法,就是使用多个相对较小的Image来组合显示成整个的工程图片。但,只要两个或多个Image的总宽度和高度超过一定数值,同样会出现这个问题,所以,无论使用多个小Image还是使用一个Image,只要其Width和Height的值稍大,就出出现问题。比较着急,现在整个项目都停止了,一直在等待解决这个问题,希望各位朋友能够援手帮忙。
非常感谢!procedure TForm1.Button1Click(Sender: TObject);
var
bmp : TBitmap;
begin
Image1.Width := 10000;
Image1.Height := 10000;
Image2.Width := 9600;
Image2.Height := 6400; bmp := TBitmap.Create;
bmp.LoadFromFile('e:\DelphiLibPath.bmp'); Image1.Canvas.Draw(0, 0, bmp); //Image2.Canvas.Draw(0, 0, bmp);
end;
我发现,将Image控件的宽度和高度设置的稍微大一点,那么在Draw时,便会出现“存储空间不足,无法处理此命令”的错误。
前段时间写一个GUI程序,类似地图一类的东西,将众多工程图片数据一次性显示在Image中。但出现了这个问题,Image不能设置的太高和太宽。为此我尝试了另外一种方法,就是使用多个相对较小的Image来组合显示成整个的工程图片。但,只要两个或多个Image的总宽度和高度超过一定数值,同样会出现这个问题,所以,无论使用多个小Image还是使用一个Image,只要其Width和Height的值稍大,就出出现问题。比较着急,现在整个项目都停止了,一直在等待解决这个问题,希望各位朋友能够援手帮忙。
非常感谢!procedure TForm1.Button1Click(Sender: TObject);
var
bmp : TBitmap;
begin
Image1.Width := 10000;
Image1.Height := 10000;
Image2.Width := 9600;
Image2.Height := 6400; bmp := TBitmap.Create;
bmp.LoadFromFile('e:\DelphiLibPath.bmp'); Image1.Canvas.Draw(0, 0, bmp); //Image2.Canvas.Draw(0, 0, bmp);
end;
解决方案 »
- fastreport的纸张设置问题
- access转excel的问题
- 求助:如何编写程序实现从电脑USB接口中移除USB设备
- "Unable to build. License is invalid or has expired",编译中的问题!
- 使用什么样的API函数可以获取Internet上的文件大小?
- 第一次过年不能回家,郁闷,唉
- 怎么知道数据库是否存在某个存储过程,在线急等!
- 请教高手modem连接问题,酬金100分
- TBDEClientDataSet问题请教!!!答者有分!!!!
- 指导:计算字段(calculated字段)中的数据怎么样才能真正的写到数据库中去?
- delphi下C/S三层结构,edit后无法applyupdate(-1),但是insert后可以,为什么
- 如何访问获取@Image 的内容?(图像数据)
image1.Height := 10000;
bmp := TBitmap.Create;
try
bmp.LoadFromFile('G:\gzxproject\控制卡1副本.bmp');
Image1.Picture.Bitmap.Assign(bmp);
finally
bmp.Free;
end;
这样试试
一般的GIS软件都是这么做的
另外,你可以:Form.DoubleBuffered := false;试试,这可以减少内存使用量,不过默认应该就是false。
但是,我之所以要定义Image的Width和Height,是因为是要在一个定义好大小的Image中,动态装载众多bmp文件,然后按照这些bmp各自指定的坐标显示在这一个Image中。所以只能用Draw(?)。Assigh显示图片是没问题的,可是我不能这样做啊。非常郁闷。
你的方案也已经在考虑中,但这个项目里面要求的好多东西,在这种方案下存在一些限制。如果这个问题实在解决不了,就采用这个方案。
是的,DoubleBuffered默认即是false;
是的,在这个Image中加载全部地图确实不太科学,但其它的一些功能使用Image确实最方便的,比如平滑缩放等等。
实在不行我们就是要PaintBox,在其自动重画的过程中画图。
因为这个项目是将n个图片按照其坐标位置画出,这样就需要在PaintBox中画出缩放的图,但计算出缩放的图后,坐标值就可能不是整数,(比如:需要在横轴5处画一个图,缩放到50%时,其坐标值就是2.5,根本不可能在坐标2.5处画图,只能从2或3处画)这样就导致了各个图片直接存在一条间隔,导致缩放的不平滑,根本不能满足实际需求。
想处理大图片别想简单了,老老实实读到dib里再往界面上画吧
我需求的最大尺寸50000×35000。画到一个大BitMap也是不可以的,BitMap的宽度和高度调整到这个高度后,和Image存在同样的问题。
非常感谢两位的回复。其实你们的建议也是采用imho888的方案,我们也以及意识到采用该方案的可行性,但是仍然还是想再试试现在的这个方案的可行性,毕竟我们要面临着非常大的工作量和较难解决的PrintBox平滑缩放问题(是在OnPrint过程中根据图片的坐标值进行缩放后显示,这样就面临着缩放后的坐标不等于实际的坐标位置)。
这太大了,24-bit的话需要5GB。只能划分成若干小图,存储在磁盘上,只把需要的部分装入。
再说也没有必要。