delphi 处理图片(剪切,压缩)
剪切bmp:效果为指定的rect大小,若图片比rect小,则会放大。
都要uses Vcl.Imaging.jpeg;
需要注意的是FMX里也需要jpeg的支持,虽然没引用编译器不会报错,但用到jpg时会报内存错误。
procedure TForm1.Button1Click(Sender: TObject);
var
Bitmap: TBitmap;
MyRect1, MyOther: TRect;
begin
if self.OpenDialog1.Execute then
begin
MyRect1 := Rect(100, 100, 500, 500);
MyOther := Rect(100, 100, 500, 500);
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile(self.OpenDialog1.FileName); // bmp图片 也可以把jpg图片转换成bmp图片
self.Canvas.CopyRect(MyOther, Bitmap.Canvas, MyRect1); // 显示在窗体上 这个在VCL上可以,在FMX里没有这个属性
Bitmap.Free;
end;
end;
缩小jpg图片,效果: 图片为rect大小,若图片大于rect,则会按比例缩小成rect大小。
procedure TForm1.Button2Click(Sender: TObject);
var
bitCut: TBitmap;
bitEdit: TBitmap;
picOriginal: TPicture;
begin
picOriginal := TPicture.Create;
if self.OpenDialog1.Execute then
begin
picOriginal.LoadFromFile(OpenDialog1.FileName); //fileName为jpg文件路径
bitCut := TBitmap.Create;
bitCut.Width := 200;
bitCut.Height := 200;
bitCut.Canvas.StretchDraw(Rect(0, 0, bitCut.Width, bitCut.Height), picOriginal.Graphic); bitEdit := TBitmap.Create;
bitEdit.Width := picOriginal.Width;
// FMX里没有这个属性,要么把引用的FMX.Graphics换成VCL的
bitCut.Canvas.CopyRect(Rect(0, 0, bitCut.Width, bitCut.Height), bitEdit.Canvas, Rect(0, 0, 200, 20));
bitcut.SaveToFile('d:/dd.jpg');
Image1.Picture.Bitmap.Assign(bitCut);
// 该释放的对象要释放
bitEdit.Free;
bitCut.Free;
picOriginal.Free;
end;
end;
裁剪图片上一部分的rect:
procedure TForm1.Button3Click(Sender: TObject);
var
bmp: TBitmap;
jpg: TJpegImage;
MyRect, MyOther: TRect;
img: TImage;
begin
jpg := TJpegImage.Create;
bmp := TBitmap.Create;
if OpenDialog1.Execute then
begin
jpg.LoadFromFile(OpenDialog1.FileName);
bmp.Assign(jpg); // 把jpg的图片资源放在bmp内
MyRect := Rect(0, 0, 200, 200);
MyOther:= Rect(0, 0, 200, 200);
SetStretchBltMode(bmp.Canvas.Handle, COLORONCOLOR); // 这个函数 uses Winapi.Windows;
Self.Canvas.CopyRect(MyOther, bmp.Canvas, MyRect); // 将一个图片复制到另一个rect上
end;
FreeAndNil(bmp);
FreeAndNil(jpg);
end;
这些这VCL里都可以实现,在FMX里就需要变引用文件,但是用起来也不是那么方便,
在FMX里这样用,delphi自带的FMX.Graphics中有处理图片的函数,具体查看帮助手册:
这里贴出画图片的功能:
procedure TForm2.Button1Click(Sender: TObject);
var
MyBitmap: TBitmap;
MyRect: TRectF;
begin
if OpenDialog1.Execute then
MyBitmap := TBitmap.CreateFromFile(OpenDialog1.Files[0]);
MyRect := TRectF.Create(10,12,301,203);
Image1.Bitmap.Canvas.BeginScene;
Image1.Bitmap.Canvas.DrawBitmap(MyBitmap, MyRect, MyRect, 20); // 这个DrawBitmap Image中必须有图片,为空画不上去。。。可能是我方法不对
Image1.Bitmap.Canvas.EndScene;
end;
从本地一张图片中复制一个rect再保存到本地:
function CopyImgRect(f0, f1: String; x, y, w, h: Integer): Boolean;
// f0磁盘图片路径名,f1保存的文件名,x,y,w,h表示给定的矩形框范围值
var
b0,b1: TBitmap;
begin
result:=True; b0:=TBitmap.Create;
b1:=TBitmap.Create; b0.LoadFromFile(f0);
b1.Width:=w;
b1.Height:=h;
b1.CopyFromBitmap(b0,rect(x,y,w,h),0,0); // 从bitmap中复制bitmap
b1.SaveToFile(f1); // 保存到本地 b0.Free;
b1.Free;
end;
delphi 处理图片(剪切,压缩)的更多相关文章
- delphi GDI 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法
delphi 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法 若有更好的,请大神留言我也学习下,感谢! uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var Bi ...
- [Swift通天遁地]四、网络和线程-(10)处理图片:压缩、缩放、圆角、CoreImage滤镜、缓存
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 项目分享五:H5图片压缩与上传
一.简介 图片的压缩与上传,是APP里一个很常用的功能.我们来年看 ChiTuStore 是怎样做的.相关文件 App/Module/User/UserInfo.html,App/Module/Use ...
- Delphi7 流操作_压缩
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- android 06
1.android原理 菜单-->MainActivity-->onCreate-->setContentView(R.layout.item)-->layout(item.x ...
- Google开源库-Volley
Android平台的网络通信库,使是网通信 更快,更简单,更健壮 适合场景: 数据量不大,通信 频繁. 大数据,流媒体是不适合使用的 * 它主要是帮我们载入和缓存从远程网络加载的图片 * 所有的 ...
- Bitmap的加载和Cache
由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16M,这导致加载Bitmap的时候很容易出现内存溢出.比如以下场景: java.lang.OutofMemoryError: ...
- Volley网络框架完全解析(缓存篇)
在上一篇中讲完了Volley框架怎么使用,那么这篇就来讲讲Volley框架的缓存机制 我们看Volley内部源码发现: Volley框架内部自己处理了DiskBasedCache硬盘缓存,但是没有处理 ...
- [Swift]通天遁地Swift
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
随机推荐
- Android自学笔记:环境配置
Info: 自学Android之旅第二篇,初步学习会有疏漏,以后我会不断修改补全,直到完美. 2014-10-09:初版 2014-11-12: 重新配置了一台电脑,更新在学习robotium过程中, ...
- Android自动化学习笔记之MonkeyRunner:MonkeyRunner环境搭建
---------------------------------------------------------------------------------------------------- ...
- C#开发Windows服务 附简单实例实现禁止QQ运行
本实例主要实现下面三个基本功能 1.C#开发windows服务 2.禁止QQ等程序运行 3.为windows服务创建自动安装程序 下面针对这三个基本功能进行实现 一.C#开发windows服务 Win ...
- linux 修改ssh端口号
vi /etc/ssh/sshd_config 找到#Port 22一段,这里是标识默认使用22端口,修改为如下: 代码如下 复制代码 Port 22 Port 50000 然后保存退出 执行/et ...
- cannot access the system temp folder
cannot access the system temp folder. please, make sure your application have full control rights on ...
- localstorage,sessionstorage使用
今天看了一下HTML5,也算是简单的学习一下吧,HTML5 提供了两种在客户端存储数据的新方法:localstorage,sessionstorage. localStorage - 没有时间限制的数 ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- Arduino 报错总结
Arduino出现avrdude: stk500_getsync(): not in sync: resp=0x00 )首先检查是否选择了合适的板子,选错主板型号也会造成上述错误 )重新安装驱动,换个 ...
- IOS 周几转化数字
NSString *weekStr = @"周二"; NSInteger weekday = [self passday:weekStr]; -(NSInteger)passda ...
- Sum All Odd Fibonacci Numbers
function sumFibs(num) { //return num; var arr = [1,1]; var add = 2; while(true){ var item = arr[0] + ...