procedure TBitmapSurface.StretchFrom(const Source: TBitmapSurface; const NewWidth, NewHeight: Integer;
APixelFormat: TPixelFormat = TPixelFormat.None);
var
I, J: Integer;
SourceI, SourceJ: Single;
SourceIInt, SourceJInt: Integer;
SourceINext, SourceJNext: Integer;
SourceIOffset, SourceJOffset: Single;
D1, D2, D3, D4: Single;
P1, P2, P3, P4: TAlphaColorF;
Dest: TAlphaColorF;
begin
if APixelFormat = TPixelFormat.None then
APixelFormat := Source.PixelFormat;

SetSize(NewWidth, NewHeight, APixelFormat);

if (Source.Width > 1) and (Source.Width > 1) and (Width > 1) and (Width > 1) then
for I := Width - 1 downto 0 do
for J := 0 to Height - 1 do
begin
SourceI := (I / (Width - 1)) * (Source.Width - 1);
SourceJ := (J / (Height - 1)) * (Source.Height - 1);

SourceIInt := Trunc(SourceI);
SourceJInt := Trunc(SourceJ);
SourceINext := Min(Source.Width - 1, SourceIInt + 1);
SourceJNext := Min(Source.Height - 1, SourceJInt + 1);

SourceIOffset := Frac(SourceI);
SourceJOffset := Frac(SourceJ);

D1 := (1 - SourceIOffset) * (1 - SourceJOffset);
D2 := SourceIOffset * (1 - SourceJOffset);
D3 := SourceIOffset * SourceJOffset;
D4 := (1 - SourceIOffset) * SourceJOffset;

P1 := TAlphaColorF.Create(Source.Pixels[SourceIInt, SourceJInt]);
P2 := TAlphaColorF.Create(Source.Pixels[SourceINext, SourceJInt]);
P3 := TAlphaColorF.Create(Source.Pixels[SourceINext, SourceJNext]);
P4 := TAlphaColorF.Create(Source.Pixels[SourceIInt, SourceJNext]);

Dest := P1 * D1 + P2 * D2 + P3 * D3 + P4 * D4;
SetPixel(I, J, Dest.Clamp.ToAlphaColor);
end;
end;

TBitmapSurface.StretchFrom的更多相关文章

  1. FMX保存JPG格式的Stream

    刚刚看以前的笔记,估计这个用的人很少 var surf:TBitmapSurface; astream:TmemoryStream; begin surf:=TbitmapSurface.Create ...

  2. FireMonkey 保存图片到JPG的方法 BMP转JPG

    习惯VCL的做法了,到了FireMonkey里面,好像查不到单独的JPEG单元了,不少朋友就郁闷如何处理JPG了,这么大件事,不可能没有处理方法的,具体就请看代码: uses FMX.Surfaces ...

  3. Android实例-调用系统APP(XE10+小米2)

    相关资料:群号383675978 实例源码: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, Sys ...

  4. delphi BitmapCompress

    unit Unit2; interface uses  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Va ...

  5. 你该知道的 TValue

    你该知道的 TValue Represents a lightweight version of the Variant type. TValue is a data structure that c ...

  6. c++builder Delphi 直接使用剪贴板 Clipboard

    c++builder Delphi 直接使用剪贴板 Clipboard 剪贴板 delphi use  Vcl.Clipbrd procedure TForm27.FormCreate(Sender: ...

  7. [FMX]在你的跨平台应用中使用剪贴板进行复制粘贴

    [FMX]在你的跨平台应用中使用剪贴板进行复制粘贴 2017-08-10 • Android.C++ Builder.Delphi.iOS.教程 • 暂无评论 • swish •浏览 516 次 VC ...

  8. FMX解析BMP文件工厂

    unit FMX.Canvas.D2D; initialization  TTextLayoutManager.RegisterTextLayout(TTextLayoutD2D, TCanvasD2 ...

  9. delphi xe10 中使用剪贴板(跨平台)

    VCL 中如何使用剪贴板咱就不说了,FMX 做为一个新的框架,提供了跨平台的剪贴板支持.FMX 对剪贴板的支持来自两个接口: IFMXClipboardService:位于 FMX.Platform. ...

随机推荐

  1. [LeetCode] Subsets 子集合

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...

  2. 【MySQL】mysql 1449 : The user specified as a definer ('root'@'%') does not exist

    权限问题,授权 给 root  所有sql 权限 1.mysql> grant all privileges on *.* to root@"%" identified by ...

  3. Redis系列之(二):Redis主从同步,读写分离

    1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...

  4. 一些常用的git指令

    PyCharm编辑器 如何切换分支 git branch 查看当前在哪个分支,也会显示本地所有的分支名 git branch dev-chenqiao 新建分支 git checkout dev-ch ...

  5. electron 入门小白贴

    electron 入门小白贴 electron demo 跑起来! 毕设准备是做个 跨平台的做题的客户端,打算用 electron 来弄. 然而今天折腾了半天才终于吧demo给跑起来了.经历了许多的问 ...

  6. C#窗体程序【用户控件-窗体】委托事件

    这里的自定义控件是由普通控件组合而成的.希望事件响应代码推迟到使用自定义控件的窗体里写.步骤一:新建一个用户控件,放两个按钮,Tag分别是btn1,btn2.这两个按钮的共用单击事件处理代码如下: u ...

  7. php 使用函数中遇到的坑之----list

    1. list 把数组中的值赋给一些变量 <?php $info = array('coffee', 'brown', 'caffeine'); // 列出所有变量 list($drink, $ ...

  8. Android_server提示端口被占用

    root@android:/data/local/tmp # ./android_server IDA Android 32-bit remote debug server(ST) v1.19. He ...

  9. Dev控件VGridView单元格绑定控件

    实现的效果如下图: 1,实现分组显示 2,每行所绑定的控件不统一,内容自定义 实现方法: 采用VGridControl进行内容的定制 首先根据XML文件进行数据填充

  10. 查看Mysql版本号 (最简单的是status )

    一.使用命令行模式进入mysql会看到最开始的提示符;二.命令行中使用status可以看到;三.使用系统函数等等,   查看版本信息 #1使用命令行模式进入mysql会看到最开始的提示符 Your M ...