我的代码如下,这是个为了说明问题而简单写的代码。
我发现,将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;  

解决方案 »

  1.   

      image1.Width := 10000;
      image1.Height := 10000;
      bmp := TBitmap.Create;
      try
        bmp.LoadFromFile('G:\gzxproject\控制卡1副本.bmp');
        Image1.Picture.Bitmap.Assign(bmp);
      finally
        bmp.Free;
      end;
    这样试试
      

  2.   

    太大可能不行,内存限制你可以这样来做,只加载显示的部份图片区域
    一般的GIS软件都是这么做的
      

  3.   

    10000*10000的24-bit图,一个大约300MB,你用了两个,差不多600MB,估计就是你的内存不够了。
    另外,你可以:Form.DoubleBuffered := false;试试,这可以减少内存使用量,不过默认应该就是false。
      

  4.   

    感谢guozhixin,你的方法是可行的。
    但是,我之所以要定义Image的Width和Height,是因为是要在一个定义好大小的Image中,动态装载众多bmp文件,然后按照这些bmp各自指定的坐标显示在这一个Image中。所以只能用Draw(?)。Assigh显示图片是没问题的,可是我不能这样做啊。非常郁闷。
      

  5.   

    to imho888:
    你的方案也已经在考虑中,但这个项目里面要求的好多东西,在这种方案下存在一些限制。如果这个问题实在解决不了,就采用这个方案。
      

  6.   

    to DelphiGuy:
    是的,DoubleBuffered默认即是false;
      

  7.   

    我试了,你改用PaintBox控件就行了,和image控件用法一样,但是没有Image控件那么复杂,你可以试试。
      

  8.   

    to imho888,guozhixin:
    是的,在这个Image中加载全部地图确实不太科学,但其它的一些功能使用Image确实最方便的,比如平滑缩放等等。
    实在不行我们就是要PaintBox,在其自动重画的过程中画图。
    因为这个项目是将n个图片按照其坐标位置画出,这样就需要在PaintBox中画出缩放的图,但计算出缩放的图后,坐标值就可能不是整数,(比如:需要在横轴5处画一个图,缩放到50%时,其坐标值就是2.5,根本不可能在坐标2.5处画图,只能从2或3处画)这样就导致了各个图片直接存在一条间隔,导致缩放的不平滑,根本不能满足实际需求。
      

  9.   

    画到一个大Bitmap(不缩放,全尺寸的),再根据需要在屏幕上画出其中的一部分就可以了(CopyRect或者Draw方法都可以)。
      

  10.   

    看你的代码你使用的是TBitmap,建议你使用TJpegImage试试,其图片功能应该是相似的,但是Jpeg对于内存的要求应该比Bitmap小得多。
      

  11.   

    image是ddb吧,硬件决定了bmp的大小,你在这台机器上能行也换了台也不一定行
    想处理大图片别想简单了,老老实实读到dib里再往界面上画吧
      

  12.   

    把你的Image放在一个ScrollBox中,显示的时候只显示可见部分
      

  13.   

    to DelphiGuy:
    我需求的最大尺寸50000×35000。画到一个大BitMap也是不可以的,BitMap的宽度和高度调整到这个高度后,和Image存在同样的问题。
      

  14.   

    to wooden954,Seamour:
    非常感谢两位的回复。其实你们的建议也是采用imho888的方案,我们也以及意识到采用该方案的可行性,但是仍然还是想再试试现在的这个方案的可行性,毕竟我们要面临着非常大的工作量和较难解决的PrintBox平滑缩放问题(是在OnPrint过程中根据图片的坐标值进行缩放后显示,这样就面临着缩放后的坐标不等于实际的坐标位置)。
      

  15.   


    这太大了,24-bit的话需要5GB。只能划分成若干小图,存储在磁盘上,只把需要的部分装入。
      

  16.   

    即使是在64位计算机和64位的操作系统下,处理非常大的图像一是需要非常快的CPU或大中型计算机,二是需要非常大的RAM,这一点对于普通的计算机来说非常难,
    再说也没有必要。