TBitmap 存储空间不足,无法处理此命令

Chen231011 2009-02-19 02:56:17
我在处理图像显示时,首先通过TPicture对象的LoadFromFile加载一个影像文件,然后把这个影像通过aBitmap.Assign(aPicture.Graphic)付给一个TBitmap对象,但是当图像过大时,总是会提示‘存储空间不足,无法处理此命令’。请问这是怎么回事?都有哪些因素会导致出现该类型的错误?对于大图像(JPEG格式的),我应该如何处理才能够正常的显示而不会出现上诉错误?
请各位高手帮忙!
...全文
732 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chen231011 2009-02-19
  • 打赏
  • 举报
回复
谢谢,我再试试看
Seamour 2009-02-19
  • 打赏
  • 举报
回复
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;

Chen231011 2009-02-19
  • 打赏
  • 举报
回复
宽大概也就10几厘米,宽应该不用考虑吧。
扫描的时候采用的彩色(24位),分辨率为300DPI,保存的格式为JPEG
Seamour 2009-02-19
  • 打赏
  • 举报
回复
默认的bmp是从设备相关位图(ddb)创建的设备无关位图(dib),前者是由硬件决定的,后者是由用户态程序的虚拟地址决定的
长3米,宽呢?打算用多少位色来保存?
Chen231011 2009-02-19
  • 打赏
  • 举报
回复
最大的图像具体是多少我不记得了,但是可以计算一下,最长的票据为3米左右,扫描分辨率为300dpi,大概为118*300。
Chen231011 2009-02-19
  • 打赏
  • 举报
回复
请问一下,该错误和机器配置有没有关系?因为我测试的时候同一张票据影像在不同配置的机器上表现不一样,配置高的可以正常处理,配置低的则会弹出该错误提示。
还有,如果分区域显示的话,TPicture对象加载的影像太大的话会不会出现该错误?
Seamour 2009-02-19
  • 打赏
  • 举报
回复
多大啊?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;
Chen231011 2009-02-19
  • 打赏
  • 举报
回复
分区域显示的话可能会有些麻烦,用户需要对照影像来处理业务,能不能给个方法,使其能够通过拖拽,连续而不是分区域的显示图像?
Chen231011 2009-02-19
  • 打赏
  • 举报
回复
用GDI+应该如何处理呢?我没有用过,请高手给个例子看一下吧,谢谢!
mdejtod 2009-02-19
  • 打赏
  • 举报
回复
这破坛子老是看不到回复
mdejtod 2009-02-19
  • 打赏
  • 举报
回复
?
bdmh 2009-02-19
  • 打赏
  • 举报
回复
用2楼的方法,分区域显示吧
bdmh 2009-02-19
  • 打赏
  • 举报
回复
image对图像大小是有要求的,太大就会报错
xzhifei 2009-02-19
  • 打赏
  • 举报
回复
按理说,图像宽度最大为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)的图像
mdejtod 2009-02-19
  • 打赏
  • 举报
回复
image 是无法处理过大的图片,用GDI+来显示应该没问题

1,185

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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