100分请教如何按比例缩小图片(改变像素大小)? ( 积分: 100 )

  • 主题发起人 主题发起人 yangh888
  • 开始时间 开始时间
Y

yangh888

Unregistered / Unconfirmed
GUEST, unregistred user!
数据库里有500张JPG图片,文件太大,太占用空间,速度慢,想按比例缩小(改变像素)后再存入数据库。
例如:将原来800×600像素缩为80×60像素,达到缩小文件字节数的目的。
谢谢!(注意是JPG的图片)
 
数据库里有500张JPG图片,文件太大,太占用空间,速度慢,想按比例缩小(改变像素)后再存入数据库。
例如:将原来800×600像素缩为80×60像素,达到缩小文件字节数的目的。
谢谢!(注意是JPG的图片)
 
有一种很简单的方法,
TImage控件你会用吧,
它的基本属性你也会用吧,
对了,你就改变TImage控件的大小就是了,
简单吧
 
procedure TForm1.FormDblClick(Sender: TObject);
var
jpgSource,jpgDest :TJPEGImage;
bmp :TBitmap;
begin
jpgSource :=TJPEGImage.Create;
jpgDest :=TJPEGImage.Create;
bmp :=TBitmap.Create;
try
jpgSource.LoadFromFile('Sunset.jpg');

bmp.Width :=jpgSource.Width div 10;
bmp.Height:=jpgSource.Height div 10;
jpgSource.DIBNeeded;
bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect,jpgSource);
//bmp.SaveToFile('result.bmp');

jpgDest.Assign(bmp);
jpgDest.SaveToFile('result.jpg');
finally
bmp.Destroy;
jpgDest.Destroy;
jpgSource.Destroy;
end;
end;
 
楼上的用的方法不就可以吗
 
TImage的stretch属性设为true再改变大小
 
dawnsong:你的方法确实可以,但是图像严重失真.....有没办法让其图像质量好点
 
失真是必然的,因为减少像素,就意味着降低分辨率,图像自然变模糊

上面那个程序段只是测试,我猜楼主是只需要Ico大小,不需要那么高质量的图片,所以就这么写了;
要想不失真,那么就不能要求图像大小,二者不可兼得
 
to dawnsong:
谢谢你的答复,你的方法可行。
我的原来的问题是因为原来sql数据库里的500张照片太大(每张约1M左右),在一张A4上纸张上用Reportmachine打印36张照片时出现奇慢死机,怀疑是资源耗尽。只好将500张读出后缩小10%后再存入,读出-缩小-更新,拟采用流方式进行。
现在程序出错:可以再帮我看看吗?再次感谢!
procedure TForm1.Button4Click(Sender: TObject);
var
jpgSource, jpgDest: TJPEGImage;
bmp: TBitmap;
readimgStream, writeimgStream: Tadoblobstream;
begin
adoc.Open;
with sql do
begin
close;
sql.clear;
sql.Add('select * from rs_stainfo');
open;
end;

jpgSource := TJPEGImage.Create;
jpgDest := TJPEGImage.Create;
bmp := TBitmap.Create;

sql.First;
while not sql.Eof do
begin
readimgStream := Tadoblobstream.Create(sql.fieldbyname('pic') as BlobField, bmread);
readimgStream.Position := 0;
try
jpgSource.LoadFromStream(readimgStream);
bmp.Width := jpgSource.Width div 10;
bmp.Height := jpgSource.Height div 10;
jpgSource.DIBNeeded;
bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect, jpgSource);
jpgDest.Assign(bmp);
sql.Edit;
writeimgStream := Tadoblobstream.Create(sql.fieldbyname('pic') as TBlobField, bmwrite);
writeimgStream.Position := 0;
jpgDest.SaveToStream(writeimgstream);
writeimgstream.LoadFromStream(writeimgstream);
sql.Post;
finally
bmp.free;
jpgDest.free;
jpgSource.free;
readimgStream.free;
writeimgstream.free;//提示数据集不在编辑模式,按F8后提示堆栈溢出
end;
sql.Next;
end;
end;
 
你在循环中把
bmp.free;
jpgDest.free;
jpgSource.free;
readimgStream.free;
writeimgstream.free;//提示数据集不在编辑模式,按F8后提示堆栈溢出
都FREE掉了,却没有创建,在循环到第二次的时候就会出错.
 
to yangh888:
--rm的那个问题我已经解决了。qq联系
 
多人接受答案了。
 

Similar threads

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