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类型.如果您 ...
随机推荐
- 添加<!doctype html>后造成JS写的定位失效
今天同事找了一个悬浮广告的插件,但是一放入页面中就失效了,也没有报错,后来通过原文件对比,发现是加了<!doctype html>. 这样子定位并不起效果: document.getEle ...
- Padding和父子继承宽高之间的关系
1.父子之间宽高的继承关系 父亲有一个宽高,儿子若不设定宽高会继承,继承宽的100%,高度靠自己内容撑开. 2.padding对儿子宽的影响 看代码: <style> .father{ w ...
- Oracle存储过程中如何使用游标
--本存储过程的功能:把test_tbl2中与test_tbl1中ID相同但salary不同的记录中的salary的值更新为test_tbl1中的salary的值--创建存储过程create or r ...
- 用saxon框架对xml数据进行过滤 - 程序员的天堂 - ITeye技术网站
用saxon框架对xml数据进行过滤 博客分类: Java Saxon 是一个 XSLT 和XQuery处理器.它是使用 XML 文档和样式表作为输入,然后生成结果文档作为输出的程序,它还包括了一 ...
- 从url中提取参数名和参数值(转)
在已知参数名的情况下,获取参数值,使用正则表达式能很容易做到.js的实现方法如下: function getValue(url, name) { var reg = new RegExp('(\\?| ...
- ICE第四篇-----python版本
ice文件: module Modipplace { interface Ipplace{ string iptoplace(string s); }; }; ...
- 布隆过滤器(BoomFilter)
1.原理: a.解决的问题: 判断一个元素是否在一个集合中 b.Hash表的特点: i.快速准确 ...
- mysql优化------2 查看系统性能(表大小,I/o性能)
三:判断mysql I/0 性能的一种方式(网络搜集供参考) show global status like 'innodb_dblwr%'\G 如果innodb_dblwr_pages_writ ...
- Linux ALSA声卡驱动之二:声卡的创建
1. struct snd_card 1.1. snd_card是什么 snd_card可以说是整个ALSA音频驱动最顶层的一个结构,整个声卡的软件逻辑结构开始于该结构,几乎所有与声音相关的逻辑设备都 ...
- 利用openURL,在IOS应用中打开另外一个应用
在IOS中,实现一个应用启动另外一个应用,使用UIApplication的openURL:方法就可实现,这里以test跳到test02为例.(需要先创建这两个工程) 注册自定义URL协议(在test中 ...