热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GdiPlus[60]:图像(十二)IGPImageAttributes的更多方法

IGPImageAttributes的方法:SetWrapMode(){设置环绕模式}这是IGPImageAttributes中出了Clone以外唯一个和颜色不相关方法.Se

IGPImageAttributes 的方法:


SetWrapMode() { 设置环绕模式 }
这是 IGPImageAttributes 中出了 Clone 以外唯一个和颜色不相关方法.



SetThreshold()、SetThreshold() { 设置、取消 "阈值" }
取值范围: 0..1
假如设置阀值为 0.5, 那么超过 128 的红色都变为 256, 少于 128 的红色都变为 0;
绿色、蓝色也是如此.



SetRemapTable()、ClearRemapTable()、SetBrushRemapTable()、ClearBrushRemapTable
{ 设置、取消 "颜色映射表" }
就是用另一种颜色替换指定颜色; 其主要参数是个数组, 可以替换多种颜色;
SetBrushRemapTable 和 ClearBrushRemapTable 专用于图元文件的画刷;
SetRemapTable 也可以完成 SetBrushRemapTable 的任务, 所以感觉 SetBrushRemapTable 有点多余.



SetColorKey()、ClearColorKey() { 设置、取消透明色范围 }
如果只指定一种透明色, 可以把两个参数值设为相同.



SetGamma()、ClearGamma() { 设置、取消伽玛校正值(或叫灰度校正值) }
可以用它调整亮度; 取值范围: 0.1..5, 默认 1



SetOutputChannel()、ClearOutputChannel() { 设置、取消 CMYK 输出通道 }
看到的 CMYK(Cyan、Magenta、Yellow、Black)各通道的效果都是灰度, 其实是颜色的强度.



SetToIdentity()、Reset() { 重置(回复默认值) }
重置时, 实用感觉是重置指定类型最好用 SetToIdentity, 全部重置用 Reset.

SetNoOp()、ClearNoOp() { 禁用、取消 SetNoOp 的禁用(也就是再使用) }



GetAdjustedPalette() { 获取变换后的调色板 }
即使是在颜色变换后, 从 IGPImage 获取的调色板也还是原来的;
获取变更后的调色板需要 IGPImageAttributes.GetAdjustedPalette().



SetColorMatrix()、ClearColorMatrix() { 设置、取消颜色调整矩阵 }
SetColorMatrices()、ClearColorMatrices() { 设置、取消颜色调整矩阵与灰度调整矩阵}

SetColorMatrices 的参数中有两个矩阵, 前者用于颜色矩阵、后者用于灰度矩阵.
SetColorMatrices 的第三个参数需要个 TGPColorMatrixFlags 类型的枚举值:
TGPColorMatrixFlags = (
ColorMatrixFlagsDefault : //只使用第一个矩阵调整颜色与灰度, 这和使用 SetColorMatrix 效果相同;
ColorMatrixFlagsSkipGrays: //只调整颜色矩阵, 同样会忽略第二个矩阵;
ColorMatrixFlagsAltGray : //只调整灰色矩阵, 此时一个矩阵被忽略.
);



SetOutputChannelColorProfile()、ClearOutputChannelColorProfile() { 设置、取消颜色配置文件}
*.icc 或 *.icm; 默认路径是 ...WINDOWS\system32\spool\drivers\color\



上述方法除 SetWrapMode、SetBrushRemapTable、ClearBrushRemapTable 外,
都有个 TGPColorAdjustType 类型的参数:

TGPColorAdjustType = (
ColorAdjustTypeDefault, // 默认, 适应用各类型
ColorAdjustTypeBitmap, // 用于位图
ColorAdjustTypeBrush, // 用于图元文件中的画刷
ColorAdjustTypePen, // 用于图元文件中的画笔
ColorAdjustTypeText, // 用于图元文件中的文本的画刷
ColorAdjustTypeCount, // 无用
ColorAdjustTypeAny // 保留
);
//如果是 ColorAdjustTypeDefault, 那么变换将应用到各类型(位图、画笔、画刷等);
//使用 Default 后, 如果再单独指定变换, 当然它不会再使用 Default 值, 但 Clear 后就回不到 Default 了.



WrapModeTile 测试:

Rect.Initialize(10, 10, Img.Width, Img.Height);
Attr := TGPImageAttributes.Create;

Graphics.FillRectangle(TGPHatchBrush.Create(
HatchStyleDiagonalCross, $FFC0C0C0, $FFE0E0E0), TGPRect.Create(ClientRect));

{ 原始 }
Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil);

//
Attr.SetColorKey($FFFFFFFF, $FFFFFFFF);
Graphics.TranslateTransform(Rect.Width + Rect.X, 0);
Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr);

//
Attr.SetColorKey($FF003399, $FF3366CC);
Graphics.TranslateTransform(Rect.Width + Rect.X, 0);
Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr);

//
Attr.SetColorKey($FF003399, $FFFFFFFF);
Graphics.TranslateTransform(Rect.Width + Rect.X, 0);
Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr);
end;



SetGamma 测试:

Rect.Initialize(4, 4, Img.Width, Img.Height);
Attr := TGPImageAttributes.Create;

{ 原始 }
Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil);

for i := 0 to 3 do
begin
Attr.SetOutputChannel(TGPColorChannelFlags(i));
Graphics.TranslateTransform(Rect.Width + Rect.X, 0);
Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr);
end;
end;



SetToIdentity 测试:

if not IsIndexedPixelFormat(Img.PixelFormat) then Exit;

Graphics := TGPGraphics.Create(Handle);
Rect.Initialize(10, 10, Img.Width, Img.Height);
Attr := TGPImageAttributes.Create;
Graphics.FillRectangle(
TGPHatchBrush.Create(HatchStyleDiagonalCross, $FFC0C0C0, $FFE0E0E0),
TGPRect.Create(ClientRect));

{ 原始 }
Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, nil);

{ SetRemapTable }
ColorMapArr[0].OldColor := $FFFF0000;
ColorMapArr[0].NewColor := $FF800000;
ColorMapArr[1].OldColor := $FF00FF00;
ColorMapArr[1].NewColor := $FF008000;
ColorMapArr[2].OldColor := $FF0000FF;
ColorMapArr[2].NewColor := $FF000080;
Attr.SetRemapTable(ColorMapArr);
Rect.Offset(Rect.Width + Rect.X, 0);
Graphics.DrawImage(Img, Rect, 0, 0, Img.Width, Img.Height, UnitPixel, Attr);

{ 枚举原图片中调色板的颜色 }
Rect.Offset(-Rect.X + 10, Rect.Height + 10);
Rect.Width := 15;
Rect.Height := 15;
Brush := TGPSolidBrush.Create(0);
ColorPalette := Img.Palette;
for i := 0 to ColorPalette.Count - 1 do
begin
Brush.Color := ColorPalette.Entries[i];
Graphics.FillRectangle(Brush, Rect);
Rect.Offset(20, 0);
end;

{ 枚举变换后的调色板的颜色 }
Rect.X := Img.Width + 20;
Attr.GetAdjustedPalette(ColorPalette, ColorAdjustTypeBitmap);
for i := 0 to ColorPalette.Count - 1 do
begin
Brush.Color := ColorPalette.Entries[i];
Graphics.FillRectangle(Brush, Rect);
Rect.Offset(20, 0);
end;
end;



SetColorMatrices 测试:

var cpro_id = "u6885494";
推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • Linux环境下Git安装及常见问题解析
    本文详细介绍了在Ubuntu系统中安装Git的过程,包括环境检查、软件安装、用户配置以及SSH密钥生成等步骤,并针对安装过程中可能出现的问题提供了有效的解决方案。 ... [详细]
  • 在Win10上利用VS2015构建Caffe2环境
    本文详细介绍如何在Windows 10操作系统上通过Visual Studio 2015编译Caffe2深度学习框架的过程。包括必要的软件安装、环境配置以及常见问题的解决方法。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 任务,栈, ... [详细]
  • 随着EOS主网的成功启动,众多开发者和投资者对其给予了高度关注。本文旨在介绍如何构建EOS开发环境,包括所需的基本硬件配置、软件安装步骤以及常见问题的解决方案。 ... [详细]
  • 本文深入探讨了Java中的代理模式,包括静态代理和动态代理的概念、实现及其应用场景。通过具体的代码示例,详细解析了如何利用代理模式增强代码的功能性和灵活性。 ... [详细]
  • 了解如何快速搭建属于自己的个人博客,无需编程基础,适合Mac和Windows用户。通过本文,您将学会使用GitHub Pages和Hexo构建一个完全自主的在线空间。 ... [详细]
  • 本文详细解析了Java编程语言中的浅克隆和深克隆概念,通过实例代码演示了两者的区别与应用场景,帮助开发者更好地理解和使用对象克隆技术。 ... [详细]
author-avatar
平凡小柏
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有