剪切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 处理图片(剪切,压缩)的更多相关文章

  1. delphi GDI 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法

    delphi 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法 若有更好的,请大神留言我也学习下,感谢! uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var  Bi ...

  2. [Swift通天遁地]四、网络和线程-(10)处理图片:压缩、缩放、圆角、CoreImage滤镜、缓存

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  3. 项目分享五:H5图片压缩与上传

    一.简介 图片的压缩与上传,是APP里一个很常用的功能.我们来年看 ChiTuStore 是怎样做的.相关文件 App/Module/User/UserInfo.html,App/Module/Use ...

  4. Delphi7 流操作_压缩

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  5. android 06

    1.android原理 菜单-->MainActivity-->onCreate-->setContentView(R.layout.item)-->layout(item.x ...

  6. Google开源库-Volley

    Android平台的网络通信库,使是网通信 更快,更简单,更健壮 适合场景: 数据量不大,通信 频繁. 大数据,流媒体是不适合使用的 * 它主要是帮我们载入和缓存从远程网络加载的图片    * 所有的 ...

  7. Bitmap的加载和Cache

    由于Bitmap的特殊性以及Android对单个应用所施加的内存限制,比如16M,这导致加载Bitmap的时候很容易出现内存溢出.比如以下场景: java.lang.OutofMemoryError: ...

  8. Volley网络框架完全解析(缓存篇)

    在上一篇中讲完了Volley框架怎么使用,那么这篇就来讲讲Volley框架的缓存机制 我们看Volley内部源码发现: Volley框架内部自己处理了DiskBasedCache硬盘缓存,但是没有处理 ...

  9. [Swift]通天遁地Swift

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

随机推荐

  1. PDF 生成插件 flying saucer 和 iText

    最近的项目中遇到了需求,用户在页面点击下载,将页面以PDF格式下载完成供用户浏览,所以上网找了下实现方案. 在Java世界,要想生成PDF,方案不少,所以简单做一个小结吧. 在此之前,先来勾画一下我心 ...

  2. Android开发--微信布局(ListView)基本运用

    ListView 1.ListVeiw 用来展示列表的View. 2.适配器 用来把数据映射到ListView上的中介. 3.数据    具体的将被映射的字符串,图片,或者基本组件. 根据列表的适配器 ...

  3. 浅谈session/cookie

    Session 和Cookie是常用的Web跟踪技术.Cookie保存在客户端,而Session则保存在服务器端,二者结合使用来跟踪用户的会话状态,是http协议的一种扩展技术.之所以说是一种扩展技术 ...

  4. delphi 10 seattle 安卓服务开发(三)

    delphi 10 里面的安卓服务有四种,上面的一篇文章里面的图有介绍. 今天做一个remote service 的例子.(里面一部分代码是抄别人的,如果不太清楚,自行恶补) remote servi ...

  5. IMoniker接口的MKParseDisplayName和 GetDisplayName的注意事项

    IMoniker接口的MKParseDisplayName和 GetDisplayName的注意事项  

  6. PHPRPC servlet发布服务

    1.服务端 web.xml PHPRPCDispacherServlet 2.客户端 controller层调用

  7. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  8. 生产力工具之vimwiki 和 calendar

    vimwiki下载地址: http://www.vim.org/scripts/script.php?script_id=2226 calendar下载地址: https://github.com/i ...

  9. NDK相关以及同步相关博客收集

    http://www.cnblogs.com/heiing/archive/2013/01/20/2868268.htmlhttp://blog.sina.com.cn/s/blog_461c24d5 ...

  10. js获取当前页面信息

    设置或获取对象指定的文件名或路径.<script>alert(window.location.pathname)</script> 设置或获取整个 URL 为字符串.<s ...