{ 将图片保存到数据库时,有时因为图片的大小 太大 或 是BMP没压缩过的图片,而我们在软件只需要看小图, 怎么办呢? 直接保存太慢、而且太占数据库。用以下函数试试. Compress_Jpg 压缩图片。 参数: Apath : 文件名(包括路径); AMaxImgWidth : 图片最大宽度。当图片实际的宽度 超过这个值时,压缩至 最大宽度。 AMaxImgHeight : 图片最大高度。当图片实际的高度 超过这个值时,压缩至 最大高度。 AImgCompress : 质量压缩比例。0~100 越低,压缩的质量越差。 } function Compress_Jpg(Apath: string; AMaxImgWidth, AMaxImgHeight, AImgCompress: Integer): TMemoryStream; procedure GetimageInfo(maxwidth, maxheight: Double; var imgwidth, imgheight: Integer); var WidthHeight:Double; {宽比高} HeightWidth:Double; {高比宽} begin WidthHeight := imgwidth/imgheight;{设置宽高比} HeightWidth := imgheight/imgwidth;{设置高宽比} if(imgwidth > maxwidth)then {如果图片的宽度 大于 设定的最大宽度,则需要按比例压缩。} begin imgwidth := Trunc(maxwidth); {图片的宽度最大为:maxwidth} imgheight := Trunc(maxwidth * HeightWidth); {让图片的宽度 乘以 高比宽 的比例。计算出最高的高度。} end; if(imgheight > maxheight)then {以上面类似,这就不写注释了.} begin imgheight := Trunc(maxheight); imgwidth := Trunc(maxHeight * WidthHeight); end; end; var bmp: TBitmap; jpg: TJpegImage; i: Integer; liu: TMemoryStream; imgwidth, imgheight: Integer; begin jpg := TJpegImage.Create; bmp := TBitmap.Create; liu := TMemoryStream.Create; if pos(UpperCase('.bmp'), UpperCase(Apath)) <> 0 then //bmp格式 begin bmp.LoadFromFile(Apath); jpg.Assign(bmp); jpg.CompressionQuality := AImgCompress; {压缩比例} jpg.Compress; imgwidth := bmp.Width; {图片的宽度} imgheight := bmp.height;{图片的高度} GetimageInfo(AMaxImgWidth, AMaxImgHeight, imgwidth, imgheight); {判断是否需要压缩,不需要压缩则返回原图大小,否则返回按比例压缩后的大小。} bmp.Width := imgwidth; bmp.height := imgheight; bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect, jpg); jpg.Assign(bmp); jpg.SaveToStream(liu); end else //其它格式 begin jpg.LoadFromFile(Apath); imgwidth := jpg.Width; imgheight := jpg.height; GetimageInfo( AMaxImgWidth, AMaxImgHeight, imgwidth, imgheight); bmp.Width := imgwidth; bmp.height := imgheight; bmp.Canvas.StretchDraw(bmp.Canvas.ClipRect, jpg); jpg.Assign(bmp); jpg.CompressionQuality := AImgCompress; jpg.Compress; jpg.SaveToStream(liu); end; jpg.Free; BMP.Free; result := liu; end;