远
远帆
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分送给帮忙提前的朋友(注意留下姓名)
论了一下。现在贴一下,希望对大家有帮助:)
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分送给帮忙提前的朋友(注意留下姓名)