文档章节

再学 GDI+[83]: TGPImage(3) - 平行四边形变换

涂孟超
 涂孟超
发布于 2014/09/26 15:34
字数 390
阅读 6
收藏 0
本例效果图:



代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormPaint(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses GDIPOBJ, GDIPAPI;

var
  img: TGPImage;
  pts: array[0..2] of TGPPoint;
  flag: Integer = -1;

procedure TForm1.FormCreate(Sender: TObject);
var
  w,h: Integer;
begin
  img := TGPImage.Create('C:\temp\test.jpg');
  w := img.GetWidth;
  h := img.GetHeight;

  pts[0] := MakePoint((ClientWidth - w) div 2 + w, (ClientHeight - h) div 2);
  pts[1] := MakePoint((ClientWidth - w) div 2, (ClientHeight - h) div 2);
  pts[2] := MakePoint((ClientWidth - w) div 2 + w, (ClientHeight - h) div 2 + h);

  DoubleBuffered := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  img.Free;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  for i := 0 to Length(pts) do
    if PtInRect(Bounds(pts[i].X-3, pts[i].Y-3, 6, 6), Point(X, Y)) then
    begin
      flag := i;
      Exit;
    end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if flag = -1 then Exit;
  pts[flag] := MakePoint(X, Y);
  Repaint;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  flag := -1;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  p: TGPPen;
  i: Integer;
begin
  g := TGPGraphics.Create(Self.Canvas.Handle);
  p := TGPPen.Create(aclRed);

  {第一点: 右上角; 第二点: 左上角; 第三点: 右下角; 第四点将根据平行四边形计算; 只能是三个点.}
  g.DrawImage(img, PGPPoint(@pts), Length(pts));

  for i := 0 to Length(pts)-1 do g.DrawRectangle(p, pts[i].X-3, pts[i].Y-3, 6, 6);

  p.Free;
  g.Free;
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 206
  ClientWidth = 307
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnDestroy = FormDestroy
  OnMouseDown = FormMouseDown
  OnMouseMove = FormMouseMove
  OnMouseUp = FormMouseUp
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/07/01/1233205.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
如何使用旋转法绘制平行四边形的窍门

很多的数学老师为了使自己的课程更加的生动有趣,往往会在课堂上使用一些辅助教程的软件,比如几何画板。但是这个需要老师能够熟练的掌握和使用这个软件。为了让大家在使用过程中更加的顺畅,...

学术研究软件
2016/07/18
64
0
【OpenCV】图像几何变换:旋转,缩放,斜切

几何变换 几何变换可以看成图像中物体(或像素)空间位置改变,或者说是像素的移动。 几何运算需要空间变换和灰度级差值两个步骤的算法,像素通过变换映射到新的坐标位置,新的位置可能是在几...

moki_oschina
2016/05/20
137
0
最实用的几何画板绘图技巧大总结

一直以来,“几何”问题是学生学习的重点以及难点,如何做到“几何直观”,困扰着许多数学教师。而随着计算机技术的迅速发展,出现了代替黑板的教学工具,几何画板就是其中一个,用它可以快速...

学术研究软件
2016/11/15
9
0
线性代数的本质(笔记3)(完)

1. 叉积与点积 点乘,也叫数量积。结果是一个向量在另一个向量方向上投影的长度,是一个标量。 叉乘,也叫向量积。结果是一个和已有两个向量都垂直的向量。 以我比较熟悉的图形学而言,一般点...

thinkando
06/03
0
0
GDI+图像处理学习笔记——改变图像的透明度

GDI+是WindowsXp和windows Server 2003中的一个子系统,主要用于处理系统的绘制消息。GDI+是GDI的扩展,其继承了GDI的有点并在其基础上进行了改进,包括增加了一些GDI无法绘制的图形函数,同...

晨曦之光
2012/05/23
491
0

没有更多内容

加载失败,请刷新页面

加载更多

ERC1155实践|区块链游戏的平行宇宙和为此而生的Enjin钱包

1 摘要 恩金(Enjin)花了大半年的时间一直在完善ERC-1155这个通证协议,毫不夸张地说,该标准是现有以太坊上最适用于游戏资产的通证标准,将主流游戏中道具涉及到的一切操作经过高度抽象之后...

HiBlock
26分钟前
0
0
Oracle发布开源的轻量级 Java 微服务框架 Helidon

近日,Oracle推出了一个新的开源框架Helidon,该项目是一个用于创建基于微服务的应用程序的Java库集合。和Payara Micro、Thorntail(之前的WildFly Swarm)、OpenLiberty、TomEE等项目一样,...

关注公众号_搜云库_每天更新
31分钟前
0
0
启动线程以及安全终止线程

启动 使用start()方法可以启动线程。 start()方法的含义是告知线程规划器线程已初始化完毕,可以分给这个线程时间片了(执行run()方法)。 安全终止线程 示例代码 import java.util.concurr...

karma123
38分钟前
1
0
Python+OpenCV 图像风格迁移(模仿名画)

现在很多人都喜欢拍照(自拍)。有限的滤镜和装饰玩多了也会腻,所以就有 APP 提供了模仿名画风格的功能,比如 prisma、versa 等,可以把你的照片变成 梵高、毕加索、蒙克 等大师的风格。 这...

crossin
42分钟前
1
0
karabiner json语法

karabiner json语法 to_if_alone 如果同时制定了to, 那么to对应的key必须是非可见字符,例如control,shift或者command, 为什么呢? If to events are specified, to events are released befo...

黄威
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部