我在处理图像显示时,首先通过TPicture对象的LoadFromFile加载一个影像文件,然后把这个影像通过aBitmap.Assign(aPicture.Graphic)付给一个TBitmap对象,但是当图像过大时,总是会提示‘存储空间不足,无法处理此命令’。请问这是怎么回事?都有哪些因素会导致出现该类型的错误?对于大图像(JPEG格式的),我应该如何处理才能够正常的显示而不会出现上诉错误?
请各位高手帮忙!

解决方案 »

  1.   

    image 是无法处理过大的图片,用GDI+来显示应该没问题
      

  2.   

    按理说,图像宽度最大为10922像素左右。
    对于大图片,可以用分块显示办法解决。
    aBitmap.Width :=100;
    aBitmap.Height :=100;
    aBitmap.Canvas.CopyRect(Rect(0,0,100,100),Image1.Canvas,Rect(100,100,200,200));
    上面代码是显示区域为(100,100,200,200)的图像
      

  3.   

    image对图像大小是有要求的,太大就会报错
      

  4.   

    用GDI+应该如何处理呢?我没有用过,请高手给个例子看一下吧,谢谢!
      

  5.   

    多大啊?20k*20k*24-bits的两张bmp是没问题的const
      IWidth  = 1024*20;
      IHeight = 1024*20;
    var
      bmp1, bmp2  : TBitmap;
    begin
      Caption := 'creating!';
      bmp1  := TBitmap.Create;
      try
        bmp1.PixelFormat  := pf24bit;
        bmp1.Width  := IWidth;
        bmp1.Height := IHeight;
        bmp2  := TBitmap.Create;
        try
          bmp2.Assign(bmp1);
          Caption := 'done';
        finally
          bmp2.Free;
        end;
      finally
        bmp1.Free;
      end;
    end;
      

  6.   

    请问一下,该错误和机器配置有没有关系?因为我测试的时候同一张票据影像在不同配置的机器上表现不一样,配置高的可以正常处理,配置低的则会弹出该错误提示。
    还有,如果分区域显示的话,TPicture对象加载的影像太大的话会不会出现该错误?
      

  7.   

    最大的图像具体是多少我不记得了,但是可以计算一下,最长的票据为3米左右,扫描分辨率为300dpi,大概为118*300。
      

  8.   

    默认的bmp是从设备相关位图(ddb)创建的设备无关位图(dib),前者是由硬件决定的,后者是由用户态程序的虚拟地址决定的
    长3米,宽呢?打算用多少位色来保存?
      

  9.   

    宽大概也就10几厘米,宽应该不用考虑吧。
    扫描的时候采用的彩色(24位),分辨率为300DPI,保存的格式为JPEG
      

  10.   

    300*118 * 300*4 * 3 < 125M,就算32-bits(对不支持alpha的bmp和jpeg除了速度可能会快点儿的话的确没意义)也才160M多点儿,这个尺寸的bmp放内存完全没问题,不知道为什么Assign一个jpeg就会出问题。试试自己建一个再复制?需要注意的是,在设W*H之前先指定PixelFormat,否则默认的pfDevice就是ddb了const
      IWidth  = 300*120;
      IHeight = 300*4;
    var
      bmp1, bmp2  : TBitmap;
    begin
      Caption := 'Creating!';
      bmp1  := TBitmap.Create;
      try
        bmp1.PixelFormat  := pf24bit;
        bmp1.Width  := IWidth;
        bmp1.Height := IHeight;
        bmp2  := TBitmap.Create;
        try
          bmp2.Assign(bmp1);
          Caption := 'done';
        finally
          bmp2.Free;
        end;
      finally
        bmp1.Free;
      end;
    end;