delphi BitmapCompress
unit Unit2;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,math,FMX.Surfaces,
FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects;
type
TForm2 = class(TForm)
Button1: TButton;
Image1: TImage;
OpenDialog1: TOpenDialog;
Image2: TImage;
Timer1: TTimer;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
class function BitmapCompress(ABitmap: TBitmap): TBitmap;
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.fmx}
{ TForm2 }
class function TForm2.BitmapCompress(ABitmap: TBitmap): TBitmap; //耗时耗内存,待优化
var
SaveParams:TBitmapCodecSaveParams;
Astream,bstream:TMemorystream;
Surf: TBitmapSurface;
intoldSize:Int64;
CompressQuality:integer;
BBitmap:TBitmap;
ratio:double;
begin
Astream:=TMemorystream.Create;
Bstream:=TMemorystream.Create;
BBitmap:=TBitmap.Create;
ABitmap.SaveToStream(Astream);
//ratio:=Astream.Size/1024;
// ratio:= 10000/ratio;
//CompressQuality:=ceil(10000/ratio);
// if Astream.Size/1024>4096 then
// CompressQuality:=5
if Astream.Size/1024>2048 then //大图小于15之后失真严重
CompressQuality:=15
else if Astream.Size/1024>1024 then
CompressQuality:=20
else if Astream.Size/1024>512 then
CompressQuality:=50
else if Astream.Size/1024>256 then
CompressQuality:=60
else if Astream.Size/1024>128 then
CompressQuality:=70
else if Astream.Size/1024<50 then
CompressQuality:=100
else
CompressQuality:=80;
//showmessage(CompressQuality.ToString);
SaveParams.Quality:=CompressQuality;
Surf:=TBitmapSurface.Create;
Surf.Assign(Abitmap);
try
if not TBitmapCodecManager.SaveToStream(bStream, Surf, 'jpg',@SaveParams) then
begin
showmessage('图片压缩失败!');
exit;
end;
except
showmessage('图片压缩意外错误!');
exit;
end;
try
if Astream.Size<Bstream.Size then
begin
// Astream.SaveToFile('d:\2.jpg');
BBitmap.LoadFromStream(Astream);
end
else
begin
// bstream.SaveToFile('d:\2.jpg');
BBitmap.LoadFromStream(bstream);
end;
except
showmessage('图片存储失败!');
exit;
end;
BBitmap.SaveToFile('d:\1111.jpg');
result:= BBitmap;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
ABitmap:Tbitmap;
StartTime,EndTime:cardinal;
begin
ABitmap :=FMX.Graphics.TBitmap.Create;
opendialog1.filter:='图片文件(*.bmp;*.png;*.jpeg;*.jpg)|*.bmp;*.png;*.jpeg;*.jpg';
if OpenDialog1.Execute then
begin
//StartTime:=GetTickCount;
ABitmap.LoadFromFile(OpenDialog1.FileName);
// Timer1.Enabled:=true;
image1.Bitmap.LoadFromFile(OpenDialog1.FileName);
image2.Bitmap.Assign(BitmapCompress(ABitmap));
end;
//Timer1.Enabled:=false;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var
BeginCount,Endcount,StartCount:Cardinal;
begin
// BeginCount:=GetTickCount;//只适用于windows,还没有找到移动端方法计算程序运行时间
end;
end.
delphi BitmapCompress的更多相关文章
- 学习笔记:7z在delphi的应用
最近做个发邮件的功能,需要将日志文件通过邮件发送回来用于分析,但是日志文件可能会超级大,测算下来一天可能会有800M的大小.所以压缩是不可避免了,delphi中的默认压缩算法整了半天不太好使,就看了看 ...
- delphi连接sql存储过程
针对返回结果为参数的 一. 先建立自己的存储过程 ALTER PROCEDURE [dbo].[REName] ) AS BEGIN select ROW_NUMBER() over(order by ...
- delphi 2010与delphi XE破解版的冲突
在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...
- [Delphi] Delphi版本号对照
VER300 Delphi Seattle / C++Builder Seattle 23 230 (Delphi:Win32/Win64/OSX/iOS32/iOS64/An ...
- delphi tidhttp 超时设置无效的解决方法
现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...
- Delphi Code Editor 之 编辑器选项
Delphi Code Editor 之 编辑器选项 可从Code Editor的右键菜单中选择“Properties”菜单项来查看编辑器选项.也可以从主菜单[Tools | Editor Optio ...
- Delphi使用ADO进行数据库编程
Delphi是一个可视化的编程工具,ADO编程也是这样,所以话不多言,直接通过代码.截图和语言来说明. 我的数据库是Oracle,为了测试,先建一个表:create table practice(un ...
- 怎么使用Delphi获取当前的时间,精确到毫秒
先介绍一个可能比较常用的方法,获取当前时间 var datetime: string; begin datetime:= FormatDateTime('yyyy-mm-dd hh:mm:ss', N ...
- Delphi在创建和使用DLL的时候如果使用到string,请引入ShareMem单元
当使用了长字符串类型的参数.变量时,如string,要引用ShareMem. 虽然Delphi中的string功能很强大,但若是您编写的Dll文件要供其它编程语言调用时,最好使用PChar类型.如果您 ...
随机推荐
- <meta http-equiv="refresh" content="0; url=">
原文:http://www.cnblogs.com/net2/archive/2010/11/29/1890874.html 页面定期刷新,如果加url的,则会重新定向到指定的网页,content后面 ...
- win7 以管理员身份运行cmd, windows services 的创建和删除
以 http 协议访问svn repository 搭建可用http访问的svn(windows) http://blog.csdn.net/yangyangrenren/article/detail ...
- phpstrom 2016.2 注册服务器地址
无意中发现的,亲测可用:http://114.215.133.70:41017
- Quick Cocos2dx 调试问题
最近由于忙了一段时间,忙完了之后又迷茫了这么久,然后终于开始继续Quick-x的学习之路了. 然后遇到了一个比较棘手的问题. 虽然照着官方mvc的例子敲代码,但是还是不停的报错,报错的问题下次集结成一 ...
- iOS开发之圆角指定
如果需要将UIView的4个角全部都为圆角,做法相当简单,只需设置其Layer的cornerRadius属性即可(项目需要使用QuartzCore框架).而若要指定某几个角(小于4)为圆角而别的不变时 ...
- 如何在微软Hyper-V下发挥SQL Server最大功效
要建设稳定运行的虚拟化SQL Server系统,关键是确保虚拟化管理软件配置能提供数据库所需的资源.SQL Server是CPU密集型技术,因此支撑它的虚拟机需要能获得充足的处理器资源,同时不能引起与 ...
- iOS第三方常用类库
1.AFNetworking AFNetworking 采用 NSURLConnection + NSOperation, 主要方便与服务端 API 进行数据交换, 操作简单, 功能强大, 现在许多人 ...
- java.lang.UnsupportedClassVersionError: com/T : Unsupported major.minor version问题解决
编译的时候jdk版本为1.8 2.运行的时候jdk版本为1.7 解决办法:将编译的jdk版本降为1.7,问题解决
- 快速搭建LNMP
[centos 6.4 server]系统安装请参考:http://blog.zhuyin.org/748.html1.防火墙设置: iptables -F service iptables save ...
- 原生JavaScript之“淘宝轮播图”
轮播图是我们学习原生js的必经之路 它包含很多基本知识的运用,像this的使用,DOM的操作,还有setInterval的使用和清除,浮动与定位等等,很好的考察了我们的基础知识牢不牢固, 话不多说,直 ...