JPG图像进一步压缩错误:JPG Error 36#(18分)

  • 主题发起人 主题发起人 acer77g
  • 开始时间 开始时间
A

acer77g

Unregistered / Unconfirmed
GUEST, unregistred user!
关于BMP转JPG的例子已很多,没有问题,但转后进一步优化时出现错误。
以前的问题我也查过,某位大虾的问题和我类似,但没有解决,现重提一下。

//以下过程的目的是将一个大的JPG通过降低质量缩成小点的JPG.
procedure CompressJPG(const Jpgfilename1,JpgFilename2:string; CompressRate:integer);
var Jpg1,Jpg2:TJPEGImage; Bmp:TBitmap;
begin
Bmp :=TBitmap.Create;
Jpg1:=TJPEGImage.Create;
Jpg1.LoadFromFile(jpgfilename1);//读大JPG
Bmp .Assign(Jpg1);//放入临时BMP中

Jpg2:=TJPEGImage.Create;
Jpg2.Assign(Bmp);//倒进小JPG中
Jpg2.CompressionQuality:=CompressRate;//设置压缩率1~100间
Jpg2.Compress;//用不用该句无所谓,似乎有上句就行
Jpg2.SaveToFile(JpgFilename2.jpg);//到此句出现错误:JPG Error 36#

Jpg2.Free;
Jpg1.Free;
Bmp .Free;
end;
疑问:
1、我的硬盘剩余1G,内存256,将没用的进程都关了,也绝无病毒,2000打了30个补丁,所以应该不是系统的问题。
2、大的JPG1如果在1M以下,进一步压成200~300K的JPG2无问题。
3、即使JPG1有4M,压缩率设成70~100,也无问题,尽管压的效果不明显。
4、JPG1>4M,压缩率<70,问题来了!!!!!!!!

就算我系统有问题,那人家ACDSEE里面的图像转换为何就没事???
一个4M的JPG(高12000×宽800),35%优化,ACDSEE可压成1M,我就想那样的效果。
 
Bmp .Assign(Jpg1);<--------這句出問題了...如果是4mb的jpg轉為bmp,你自己轉一下,估計內存都用光了吧...

自己計一下12000x800的圖在bmp是多少mb吧...
 
我不太会算,按32位真彩计算,一点是32位,4个字节,
12000x800x4/1024/1024≈36.6M,对吧。
如果这样,应该不算太大。
1.WIN2000应会自动利用磁盘作为虚拟内存。
2.为何压缩率>70%就没事?
3.人家ACDSEE是咋做的?
 
关 注此问题
 
Jpg2.SaveToFile(JpgFilename2.jpg);//到此句出现错误:JPG Error 36#

这句话有问题啊: 不可能编译通过吧?
 
笔误,应为:
Jpg2.SaveToFile(JpgFilename2);//到此句出现错误:JPG Error 36#
 
我又试验了一下,发现和压缩无关。
Jpg2.SaveToFile(JpgFilename2);不压缩时也出现这个错误,但不稳定,
时有时无,费解。
 
SaveToFile 就自动调用压缩了,所以还是和压缩有关

我估计你是用D6,对吗?
 
[12000x800x4/1024/1024≈36.6M]
不能这么算的.DIB是系统管理的,不仅仅是你进程的内存.看过在Win98下边的资源占用和资源不足吗?很多时候不是内存不够(否则起码可以用虚拟内存).
 
关注.可以通过按比例缩小图片的方法!
 
这不是你的程序问题。是JPEG类有问题,BORLAND网站上有说明。当压缩后JPEG大小超过1M,很有可能出现这个问题。解决方法是用第三方控件,或调用INTEL的IJL动态链接库保存JPEG。
 
释迦的解释接近我的推测,请发发释迦菩萨心肠,告诉我哪有三方控件。
 
GDI+ http://www.progdigy.com/headers/index.html
 
后退
顶部