再学 GDI+[95]: TGPImage(15) - 颜色的旋转变换

本文介绍使用 GDI+ 在 Windows 应用程序中实现 PNG、GIF 和 TIF 格式的透明图像显示,并演示如何通过调整颜色矩阵来实现图像的三维旋转效果。
我通过做此例同时证实了 GDI+ 可以直接显示 png、gif、tif 格式的透明图片.

//红色与绿色绕蓝色旋转(r 是弧度)
ColorMatrix: TColorMatrix = (
  (Cos(r),   Sin(r), 0.0,  0.0,  0.0),
  (-Sin(r),  Cos(r), 0.0,  0.0,  0.0),
  (0.0,      0.0,    1.0,  0.0,  0.0),
  (0.0,      0.0,    0.0,  1.0,  0.0),
  (0.0,      0.0,    0.0,  0.0,  1.0));

//绿色与蓝色绕红色旋转(r 是弧度)
ColorMatrix: TColorMatrix = (
  (0.0,  0.0,     0.0,     0.0,  0.0),
  (0.0,  Cos(r),  Sin(r),  0.0,  0.0),
  (0.0,  -Sin(r), Cos(r),  0.0,  0.0),
  (0.0,  0.0,     0.0,     1.0,  0.0),
  (0.0,  0.0,     0.0,     0.0,  1.0));

//红色与蓝色绕绿色旋转(r 是弧度)
ColorMatrix: TColorMatrix = (
  (Cos(r),   0.0,  Sin(r),  0.0,  0.0),
  (-Sin(r),  0.0,  Cos(r),  0.0,  0.0),
  (0.0,      0.0,  1.0,     0.0,  0.0),
  (0.0,      0.0,  0.0,     1.0,  0.0),
  (0.0,      0.0,  0.0,     0.0,  1.0));
本例效果图:

o_8762.gif

代码文件:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    TrackBar1: TTrackBar;
    RadioGroup1: TRadioGroup;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure CheckBox1Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses GDIPOBJ, GDIPAPI;

const
  Matrix: TColorMatrix = (
    (1.0, 0.0, 0.0, 0.0, 0.0),
    (0.0, 1.0, 0.0, 0.0, 0.0),
    (0.0, 0.0, 1.0, 0.0, 0.0),
    (0.0, 0.0, 0.0, 1.0, 0.0),
    (0.0, 0.0, 0.0, 0.0, 1.0));

procedure TForm1.FormCreate(Sender: TObject);
begin
  TrackBar1.Height := 23;
  TrackBar1.ShowSelRange := False;
  TrackBar1.Min := -180;
  TrackBar1.Max := 180;
  TrackBar1.Position := 0;

  with RadioGroup1.Items do
  begin
    Add('红色与绿色绕蓝色旋转');
    Add('红色与蓝色绕绿色旋转');
    Add('绿色与蓝色绕红色旋转');
  end;
  RadioGroup1.ItemIndex := 0;

  DoubleBuffered := True;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
  g: TGPGraphics;
  img: TGPImage;
  ImageAttributes: TGPImageAttributes;
  r: Single;
  ColorMatrix: TColorMatrix;
begin
  g := TGPGraphics.Create(Canvas.Handle);
  img := TGPImage.Create('c:\temp\test.png');

  ImageAttributes := TGPImageAttributes.Create;

  r := TrackBar1.Position * pi / 180; {根据角度算出弧度}
  ColorMatrix := Matrix;              {回复默认值}
  case RadioGroup1.ItemIndex of
    0: begin {红色与绿色绕蓝色旋转}
      ColorMatrix[0,0] := Cos(r);
      ColorMatrix[0,1] := Sin(r);
      ColorMatrix[1,0] := -Sin(r);
      ColorMatrix[1,1] := Cos(r);
    end;
    1: begin {红色与蓝色绕绿色旋转}
      ColorMatrix[0,0] := Cos(r);
      ColorMatrix[0,2] := Sin(r);
      ColorMatrix[2,0] := -Sin(r);
      ColorMatrix[2,2] := Cos(r);
    end;
    2: begin {绿色与蓝色绕红色旋转}
      ColorMatrix[1,1] := Cos(r);
      ColorMatrix[1,2] := Sin(r);
      ColorMatrix[2,1] := -Sin(r);
      ColorMatrix[2,2] := Cos(r);
    end;
  end;

  ImageAttributes.SetColorMatrix(ColorMatrix);

  g.DrawImage(img,
              MakeRect(4, 4, img.GetWidth, img.GetHeight),
              0,
              0,
              img.GetWidth,
              img.GetHeight,
              UnitPixel,
              ImageAttributes
              );

  ImageAttributes.Free;
  img.Free;
  g.Free;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
  Repaint;
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Repaint;
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
  Repaint;
end;

end.
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 290
  ClientWidth = 208
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  Position = poDesktopCenter
  OnCreate = FormCreate
  OnPaint = FormPaint
  PixelsPerInch = 96
  TextHeight = 13
  object TrackBar1: TTrackBar
    Left = 3
    Top = 170
    Width = 202
    Height = 22
    TabOrder = 0
    OnChange = TrackBar1Change
  end
  object RadioGroup1: TRadioGroup
    Left = 8
    Top = 198
    Width = 190
    Height = 83
    Caption = 'RadioGroup1'
    TabOrder = 1
    OnClick = RadioGroup1Click
  end
end
dnSpy是目前业界广泛使用的一款.NET程序的反编译工具,支持32位和64位系统环境。它允许用户查看和编辑.NET汇编和反编译代码,以及调试.NET程序。该工具通常用于程序开发者在维护和调试过程中分析程序代码,尤其在源代码丢失或者无法获取的情况下,dnSpy能提供很大的帮助。 V6.1.8版本的dnSpy是在此系列软件更新迭代中的一个具体版本号,代表着该软件所具备的功能与性能已经达到了一个相对稳定的水平,对于处理.NET程序具有较高的可用性和稳定性。两个版本,即32位的dnSpy-net-win32和64位的dnSpy-net-win64,确保了不同操作系统架构的用户都能使用dnSpy进行软件分析。 32位的系统架构相较于64位,由于其地址空间的限制,只能支持最多4GB的内存空间使用,这在处理大型项目时可能会出现不足。而64位的系统能够支持更大的内存空间,使得在处理大型项目时更为方便。随着计算机硬件的发展,64位系统已经成为了主流,因此64位的dnSpy也更加受开发者欢迎。 压缩包文件名“dnSpy-net-win64.7z”和“dnSpy-net-win32.7z”中的“.7z”表示该压缩包采用了7-Zip压缩格式,它是一种开源的文件压缩软件,以其高压缩比著称。在实际使用dnSpy时,用户需要下载对应架构的压缩包进行解压安装,以确保软件能够正确运行在用户的操作系统上。 dnSpy工具V6.1.8版本的发布,对于.NET程序员而言,无论是32位系统还是64位系统用户,都是一个提升工作效率的好工具。用户可以根据自己计算机的操作系统架构,选择合适的版本进行下载使用。而对于希望进行深度分析.NET程序的开发者来说,这个工具更是不可或缺的利器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值