关于tjpegimage的用法解析(UP有分)(100分)

  • 主题发起人 主题发起人 远帆
  • 开始时间 开始时间

远帆

Unregistered / Unconfirmed
GUEST, unregistred user!
tjpegimage是一个很常用的一个类。但是我们在使用时往往有些误区,刚刚和卷起千堆雪讨
论了一下。现在贴一下,希望对大家有帮助:)

procedure TForm1.Button1Click(Sender: TObject);
var
Jpg:TJPEGImage;
begin
Jpg:=TJPEGImage.Create;
Jpg.LoadFromFile('1.Jpg');
Jpg.CompressionQuality:=30;
Jpg.Compress;
Jpg.SaveToFile('2.jpg');
Jpg.Free;
end;

上面这段代码有问题吗?初看起来这段代码什么问题也没有,但是运行后,2.jpg的大小为
零,为什么?

下面是帮助中对compress的解释:
Call Compress to compress for optimization, such as before streaming out when as
signing a bitmap to a jpeg. Changing properties like CompressionQuality does not
^注意此处
force compression. To force compression, call Compress.

我认为这段话是说,compress过程只能对由tbitmap传入tjpegimage的图像进行压缩(不知是
否正确,欢迎大家提出自已的想法)

为了验证这个想法是否正确我们可以编写如下程序:
procedure TForm1.Button1Click(Sender: TObject);
var
Jpg:TJPEGImage;
Bmp:TBitmap;
begin
Bmp:=TBitmap.Create;
Bmp.LoadFromFile('1.Bmp');

Jpg:=TJPEGImage.Create;
// Jpg.LoadFromFile('1.Jpg');
Jpg.Assign(Bmp);
Jpg.CompressionQuality:=30;
Jpg.Compress;
Jpg.SaveToFile('2.jpg');
Jpg.Free;

Bmp.Free;
end;
这段代码的确取得了成功。

那么是不是只要是由别的图像对像传入的都可以压缩成功呢?我们可以试试将tbitmap换成
tjpegimage,然后同样的assign给jpg对像,但是不能成功。

所以,我们如果必需对一jpg图像进行压缩该怎么办呢?
我想可以采用下面的方法(验证成功)
procedure TForm1.Button1Click(Sender: TObject);
var
Jpg,Jpo:TJPEGImage;
Bmp:TBitmap;
begin
Bmp:=TBitmap.Create;
Jpo:=TJPEGImage.Create;
Jpo.LoadFromFile('1.Jpg');
Bmp.Assign(Jpo);

Jpg:=TJPEGImage.Create;
Jpg.Assign(Bmp);
Jpg.CompressionQuality:=30;
Jpg.Compress;
Jpg.SaveToFile('2.jpg');
Jpg.Free;

Jpo.Free;
Bmp.Free;
end;
是不是有些麻烦?但是的确可以这么做。

我们注意到帮助中有这么一句话:“force compression”(强制压缩)。
我们可以试验在第二段,第三段代码中去掉
Jpg.Compress;
对于结果不会有任何影响。这说明了在调用
Jpg.CompressionQuality:=30;
一句时已经“隐式”完成了压缩,而
Jpg.Compress;
进行强制压缩就没有什么必要了。

但是对于第一段代码去掉强制压缩后会出现不同的情况,得到的2.jpg不再是0长度,而是与
源图片(1.jpg)相同。

其实这也很好理解是不是?在强制压缩时若不能压缩,那么图像就会被置0,而隐式压缩时
若不能压缩,则图像不会有任何变化。

结论:
其实在很多时候,不显示调用compress过程反而更安全。


为了让更多的朋友看到此贴,我留下100分送给帮忙提前的朋友(注意留下姓名)
 
完全正确!
这里看过来:http://www.delphibbs.com/delphibbs/dispq.asp?lid=945589
 
呵呵~卷兄,用那么多分来推广小弟的贴子?
:)
 
“不是每一份耕耘都有收获;也不是每一份付出都会有回报。
但是啊。。。一份付出就是一颗希望的种子。。。 ”

是的,付出总有回报;
偶们懂得饮水思源的道理哦!
 
远帆,好样的,我不要分!
 
谢谢鼓励:)
怎么我每回发的贴子看得人都那么少?
 
UP+收藏
第一次见这么爽的贴子
等我成了高手时也要向远帆兄学习!
 
爽。。。真的爽极了!我要分!要分哟!up
up
up
up
up
up
 
我也是的.
 
TO 远帆:
你这样做对我们帮助很大,我E文不好。。。。谢谢了。
 
支持一下!我觉得人很多了,要不现在人们处理图象比较少,处理数据库比较多!
 
再次UP
但我不要分,因为这贴子太爽了!
 
再次帮你up一下,真的很有意思!
 
谢谢,拿分

老兄们觉得 图象处理 和 数据库 哪个难?
 
谢谢~ 收藏!
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
663
import
I
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部