文档章节

再学 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
2018/06/03
0
0
GDI+图像处理学习笔记——改变图像的透明度

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

晨曦之光
2012/05/23
500
0

没有更多内容

加载失败,请刷新页面

加载更多

传统IDC部署网站(三)

11. 重置密码 密钥和密码都支持远程登陆, 二选一 两个都可以登陆, 密钥相对于密码来说,相对安全一点 本地登陆无法是用密钥 修改密码 root 用户 passwd root 修改普通用户 passwd usernam...

miko0089
10分钟前
2
0
日志服务与SIEM(如Splunk)集成方案实战

背景信息 目标 本文主要介绍如何让阿里云日志服务与您的SIEM方案(如Splunk)对接, 以便确保阿里云上的所有法规、审计、与其他相关日志能够导入到您的安全运维中心(SOC)中。 名词解释 LOG(S...

阿里云官方博客
14分钟前
1
0
bash特性

1.支持别名 alias 2.命令替换 $(COMMANS) 或者 `COMMAND` 3. bash支持的引号: `` :命令替换 "":弱引用,可以实现变量替换 '':强引用,不实现变量替换 4.文件名通配 globbing: * : 任意长...

忙碌的小蜜蜂
19分钟前
2
0
以语音评测的PC端demo代码为例,讲解口语评测如何实现

本文由云+社区发表 作者:腾讯智慧教育 概述 腾讯云智聆口语评测(英文版)(Smart Oral Evaluation-English,SOE-E)是腾讯云推出的语音评测产品,是基于英语口语类教育培训场景和腾讯云的语...

腾讯云加社区
31分钟前
1
0
浅谈SpringMVC之DispatcherServlet

Spring的MVC框架是围绕一个DispatcherServlet其实就是个Servlet(它继承自HttpServlet基类)来设计的, 它支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染、文件上传等 控制器一般...

恋码之子
33分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部