IGPMatrix 矩阵 是个接口, 要通过 TGPMatrix 实例化后使用, 其内置了很多方法和属性.
TGPColorMatrix 只是一个结构体, 除了矩阵数据(5*5)外, 它只有一个方法: TGPColorMatrix.SetToIdentity.
通过 SetToIdentity 方法可初始化矩阵, 初始化后的数据是:
┏ ┓ ┃1 0 0 0 0┃ ┃0 1 0 0 0┃ ┃0 0 1 0 0┃ ┃0 0 0 1 0┃ ┃0 0 0 0 1┃ ┗ ┛
对角线上的 1 是比例; 应用这个数据后, 目标不会有任何变化.
其中的第 5 行和第 5 列用于辅助运算, 我们主要操作 4*4 的范围; 为便于理解可以这样表示:
┏ ┓ ┃rr gr br ar┃ ┃rg gg bg ag┃ ┃rb gb bb ab┃ ┃ra ga ba aa┃ ┗ ┛
rr、gg、bb、aa 分别表示红、绿、蓝和透明度的比例; 譬如 aa = 0.5 表示半透明.
第四行的 ra、ga、ba 分别是颜色的增减量; 譬如 ra = 0.1 表示红色增加 10%.
第一列的 rr、rg、rb 分别表示: 红色应用其他颜色的比例; 譬如 rg = 0.5, 那么红色的值将是绿色成分的 50%.
第二列的 gr、gg、gb 分别表示: 绿应用其他颜色的比例.
第三列的 br、bg、bb 分别表示: 蓝色应用其他颜色的比例.
还有一个颜色旋转的概念:
//红色与绿色绕蓝色旋转(其中的 f 是弧度, 弧度 = 角度 * Pi / 180): ┏ ┓ ┃ Cos(f) Sin(f) br ar┃ ┃-Sin(f) Cos(f) bg ag┃ ┃ rb gb bb ab┃ ┃ ra ga ba aa┃ ┗ ┛ //绿色与蓝色绕红色旋转: ┏ ┓ ┃rr gr br ar┃ ┃rg Cos(f) Sin(f) ag┃ ┃rb -Sin(f) Cos(f) ab┃ ┃ra ga ba aa┃ ┗ ┛ //红色与蓝色绕绿色旋转: ┏ ┓ ┃ Cos(f) gr Sin(f) ar┃ ┃-Sin(f) gg Cos(f) ag┃ ┃ rb gb bb ab┃ ┃ ra ga ba aa┃ ┗ ┛
这个东西可千变万化, 一时很难彻底理解, 譬如前人算出的灰度算法:
┏ ┓ ┃0.299 0.299 0.299 0┃ ┃0.518 0.518 0.518 0┃ ┃0.114 0.114 0.114 0┃ ┃0 0 0 1┃ ┗ ┛
颜色矩阵是通过 ImageAttributes 使用的, 下面是一些简单的例子.
比例设置:
![o_10010101.png](https://i-blog.csdnimg.cn/blog_migrate/54e490e51c155cf2a4a50760d3840629.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 红色比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 绿色比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[1, 1] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 蓝色比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[2, 2] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 透明度比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[3, 3] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
增减量:
![o_10010102.png](https://i-blog.csdnimg.cn/blog_migrate/e622cba78eb84d01e34e52f4b190d3c2.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 红色增减 } ColorMatrix.SetToIdentity; ColorMatrix.M[4, 0] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 绿色增减 } ColorMatrix.SetToIdentity; ColorMatrix.M[4, 1] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 蓝色增减 } ColorMatrix.SetToIdentity; ColorMatrix.M[4, 2] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 透明度增减 } ColorMatrix.SetToIdentity; ColorMatrix.M[4, 3] := -0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
红色使用其他颜色的比例:
![o_10010103.png](https://i-blog.csdnimg.cn/blog_migrate/ec396cfc9259e0540658b1ebc7d0c082.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 红色应用红色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 红色应用绿色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 1] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 红色应用蓝色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 2] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
绿色使用其他颜色的比例:
![o_10010104.png](https://i-blog.csdnimg.cn/blog_migrate/32e825338fc16753fe4ba64f09be38ca.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 绿色应用红色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[1, 0] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 绿色应用绿色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[1, 1] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 绿色应用蓝色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[1, 2] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
蓝色使用其他颜色的比例:
![o_10010105.png](https://i-blog.csdnimg.cn/blog_migrate/6c217396e64cbbca01c8835d554cd085.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 蓝色应用红色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[2, 0] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 蓝色应用绿色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[2, 1] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 蓝色应用蓝色的比例 } ColorMatrix.SetToIdentity; ColorMatrix.M[2, 2] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
查看独立的颜色通道:
![o_10010106.png](https://i-blog.csdnimg.cn/blog_migrate/619db6c0f94a73274ae7d7c2ec2f8665.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 只查看红色通道 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := 1; ColorMatrix.M[1, 1] := 0; ColorMatrix.M[2, 2] := 0; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 只查看绿色通道 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := 0; ColorMatrix.M[1, 1] := 1; ColorMatrix.M[2, 2] := 0; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 只查看蓝色通道 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := 0; ColorMatrix.M[1, 1] := 0; ColorMatrix.M[2, 2] := 1; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 半透明查看红色通道 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := 1; ColorMatrix.M[1, 1] := 0; ColorMatrix.M[2, 2] := 0; ColorMatrix.M[3, 3] := 0.5; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
转灰度:
![o_10010107.png](https://i-blog.csdnimg.cn/blog_migrate/7d384b0eede6b9eaa6807578dbcbf828.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 灰度 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := 0.299; ColorMatrix.M[0, 1] := 0.299; ColorMatrix.M[0, 2] := 0.299; ColorMatrix.M[1, 0] := 0.518; ColorMatrix.M[1, 1] := 0.518; ColorMatrix.M[1, 2] := 0.518; ColorMatrix.M[2, 0] := 0.114; ColorMatrix.M[2, 1] := 0.114; ColorMatrix.M[2, 2] := 0.114; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
加亮、变暗:
![o_10010108.png](https://i-blog.csdnimg.cn/blog_migrate/859541d76607f5752c2680a97aa10872.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 加亮 } ColorMatrix.SetToIdentity; ColorMatrix.M[3, 0] := 0.2; ColorMatrix.M[3, 1] := 0.2; ColorMatrix.M[3, 2] := 0.2; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 变暗 } ColorMatrix.SetToIdentity; ColorMatrix.M[3, 0] := -0.2; ColorMatrix.M[3, 1] := -0.2; ColorMatrix.M[3, 2] := -0.2; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
颜色旋转:
![o_10010109.png](https://i-blog.csdnimg.cn/blog_migrate/f74430915edcebe59850914bdcf4e159.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; f: Single; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(4, 4, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; f := 30 * Pi / 180; { 准备旋转 30 度角 } { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 红色与绿色绕蓝色旋转 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := Cos(f); ColorMatrix.M[0, 1] := Sin(f); ColorMatrix.M[1, 0] := -Sin(f); ColorMatrix.M[1, 1] := Cos(f); Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 绿色与蓝色绕红色旋转 } ColorMatrix.SetToIdentity; ColorMatrix.M[1, 1] := Cos(f); ColorMatrix.M[1, 2] := Sin(f); ColorMatrix.M[2, 1] := -Sin(f); ColorMatrix.M[2, 2] := Cos(f); Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); { 红色与蓝色绕绿色旋转 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := Cos(f); ColorMatrix.M[0, 2] := Sin(f); ColorMatrix.M[1, 0] := -Sin(f); ColorMatrix.M[1, 2] := Cos(f); Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
对比度:
![o_10010110.png](https://i-blog.csdnimg.cn/blog_migrate/7217a468ae7239d6e429faea19442c28.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\Grapes.jpg'); Rect.Initialize(10, 10, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 对比度 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := 1.1; ColorMatrix.M[1, 1] := 1.1; ColorMatrix.M[2, 2] := 1.1; ColorMatrix.M[3, 0] := 0.001; ColorMatrix.M[3, 1] := 0.001; ColorMatrix.M[3, 2] := 0.001; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;
反色:
![o_10010111.png](https://i-blog.csdnimg.cn/blog_migrate/838fd160e1e8d233da949d67b66545d1.png)
uses GdiPlus; procedure TForm1.FormPaint(Sender: TObject); var Graphics: IGPGraphics; Img: IGPImage; Attr: IGPImageAttributes; ColorMatrix: TGPColorMatrix; Rect: TGPRectF; Brush: IGPHatchBrush; begin Graphics := TGPGraphics.Create(Handle); Brush := TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFD0D0D0, $FFFFFFFF); Graphics.FillRectangle(Brush, TGPRect.Create(ClientRect)); Img := TGPImage.Create('C:\GdiPlusImg\ImageFileSmall.jpg'); Rect.Initialize(10, 10, Img.Width * 0.75, Img.Height * 0.75); Attr := TGPImageAttributes.Create; { 原始图片 } Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil); { 反色(或叫负片、底片)效果 } ColorMatrix.SetToIdentity; ColorMatrix.M[0, 0] := -1; ColorMatrix.M[1, 1] := -1; ColorMatrix.M[2, 2] := -1; ColorMatrix.M[3, 0] := 0.999; ColorMatrix.M[3, 1] := 0.999; ColorMatrix.M[3, 2] := 0.999; Attr.SetColorMatrix(ColorMatrix); Graphics.TranslateTransform(Rect.Width + Rect.X, 0); Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr); end;