热门标签 | 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";
推荐阅读
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • 浅析python实现布隆过滤器及Redis中的缓存穿透原理_python
    本文带你了解了位图的实现,布隆过滤器的原理及Python中的使用,以及布隆过滤器如何应对Redis中的缓存穿透,相信你对布隆过滤 ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文介绍了如何在GitHub上设置多个SSH Key,以解决原有Key失效的问题,并确保不同项目使用不同的私钥进行安全访问。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • 微信公众号推送模板40036问题
    返回码错误码描述说明40001invalidcredential不合法的调用凭证40002invalidgrant_type不合法的grant_type40003invalidop ... [详细]
  • MySQL 5.7 学习指南:SQLyog 中的主键、列属性和数据类型
    本文介绍了 MySQL 5.7 中主键(Primary Key)和自增(Auto-Increment)的概念,以及如何在 SQLyog 中设置这些属性。同时,还探讨了数据类型的分类和选择,以及列属性的设置方法。 ... [详细]
  • com.hazelcast.config.MapConfig.isStatisticsEnabled()方法的使用及代码示例 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
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社区 版权所有