使用C#通过ColorMatrix对象为图像重新着色

此示例产生了一些令人印象深刻的结果,但实际上非常简单。
它使用其他几个示例演示的 ImageAttribute 技术来快速操作图像的颜色。
下面的AdjustColor方法启动图像着色的过程。

// Adjust the image's colors.
private Image AdjustColor(Image image)
{// Make the ColorMatrix.ColorMatrix cm = GetColorMatrix();ImageAttributes attributes = new ImageAttributes();attributes.SetColorMatrix(cm);// Make the result image.return image.CopyImage(attributes);
}


此方法调用稍后描述的GetColorMatrix方法来获取一个ColorMatrix对象,该对象保存您在文本框中输入的值。然后,它创建一个ImageAttribute对象,并使用其SetColorMatrix方法将ColorMatrix存储在ImageAttribute对象中。最后,它调用CopyImage扩展方法(稍后描述)将颜色矩阵应用于图像并返回结果。

以下代码显示GetColorMatrix方法。
// Return the matrix entered by the user.
private ColorMatrix GetColorMatrix()
{float[][] values = GetMatrix();if (values == null) return null;return new ColorMatrix(values);
}

GetColorMatrix 方法调用GetMatrix方法来获取一个float[][],其中包含您在程序的文本框中输入的值。以下代码显示GetMatrix方法。

private float[][] GetMatrix()
{float[][] values = new float[][]{new float[5],new float[5],new float[5],new float[5],new float[5],};for (int i = 0; i < 5; i++){for (int j = 0; j < 5; j++){float value;if (!float.TryParse(TextBoxes[i][j].Text, out value)){MessageBox.Show("Invalid entry");TextBoxes[i][j].Focus();return null;}values[i][j] = value;}}return values;
}

此方法创建一个float[][] ,然后通过循环遍历TextBoxes数组的行和列来填充它,该数组保存对程序的TextBox控件的引用。


以下代码显示程序如何初始化TextBoxes数组。

private TextBox[][] TextBoxes;// Display the image converted to sepia tone.
private void Form1_Load(object sender, EventArgs e)
{TextBoxes = new TextBox[][]{new TextBox[] {txt00, txt01, txt02, txt03, txt04},new TextBox[] {txt10, txt11, txt12, txt13, txt14},new TextBox[] {txt20, txt21, txt22, txt23, txt24},new TextBox[] {txt30, txt31, txt32, txt33, txt34},new TextBox[] {txt40, txt41, txt42, txt43, txt44},};
}

 

程序在类级别声明了TextBoxes数组。其Form_Load事件处理程序初始化该数组。

快速回顾一下,GetColorMatrix调用GetMatrix来获取您输入的浮点值,并使用该数组创建和返回ColorMatrix对象。GetMatrix方法循环遍历TextBoxes数组以填充它返回的数组。


复制图像
.NET Image类提供了几种创建图像副本的方法。最省事的方法是调用其Clone方法。不幸的是,该方法返回一个通用oobject ,因此如果您想将其用作Image,则需要将其转换为Image。

复制图像是我经常做的事情,所以我决定创建以下两种扩展方法来使其更容易。

public static class Extensions
{public static Image CopyImage(this Image image){return (Image)image.Clone();}public static Image CopyImage(this Image image, ImageAttributes attributes){Bitmap result = new Bitmap(image.Width, image.Height);using (Graphics gr = Graphics.FromImage(result)){Rectangle rect = new Rectangle(0, 0, image.Width, image.Height);gr.DrawImage(image, rect,0, 0, image.Width, image.Height,GraphicsUnit.Pixel, attributes);}return result;}
}

第一个方法克隆图像,将结果重新转换为Image并返回结果。您可以像以下代码一样使用它。

Image copy_of_image = original_image.CopyImage();

第二种方法复制图像,同时将ImageAttributes对象应用于该图像。这就是本示例为图像着色的方式。

第二种方法创建一个与原始图像大小相同的新Bitmap对象,并创建一个关联的Graphics对象。它创建一个大小适合图像的Rectangle ,然后调用Graphics对象的DrawImage方法将图像绘制到新的Bitmap上。(这就是我想要制作扩展方法的原因之一。将图像绘制到另一幅图像上的方法很不方便。使用这种方法,我不必费心创建一个Rectangle并将坐标、宽度和高度传递给DrawImage方法。)

前面显示的AdjustColor 方法在以下语句中 使用了CopyImage的第二个版本。

// Make the result image.
return image.CopyImage(attributes);

示例程序还包括其他一些细节,例如打开和保存文件的代码,以及填充特定颜色(例如红色、绿色、棕褐色等)矩阵值的菜单项。(文章顶部的图片显示了转换为棕褐色调的图像。)

完整源码:
https://download.csdn.net/download/ljygood2/90104001

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/488491.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink 核心知识总结:窗口操作、TopN 案例及架构体系详解

目录 一、FlinkSQL 的窗口操作 &#xff08;一&#xff09;窗口类型概述 &#xff08;二&#xff09;不同时间语义下窗口实践 EventTime&#xff08;事件时间&#xff09; ProcessTime&#xff08;处理时间&#xff09; 二、窗口 TopN 案例解析 三、Flink架构体系 &…

如何部署FastAPI

环境&#xff1a; Win10 FastAPI 问题描述&#xff1a; 如何部署FastAPI 解决方案&#xff1a; FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;使用 Python 3.6 及更高版本。它的设计目的是提供简单且易于使用…

day10性能测试(2)——Jmeter安装环境+线程组+Jmeter参数化

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 目录 1、LoadRunner vs Jmeter 1.1 LoadRunner 1.2 Jmeter 1.3 对比小结 2、Jmeter 环境安装 2.1 安装jdk 2.2 安装Jmeter 2.3 小结 3、Jmeter 文件目录结构 4、Jmeter默认配置修改 5、Jmeter元件、组…

Android显示系统(08)- OpenGL ES - 图片拉伸

Android显示系统&#xff08;02&#xff09;- OpenGL ES - 概述 Android显示系统&#xff08;03&#xff09;- OpenGL ES - GLSurfaceView的使用 Android显示系统&#xff08;04&#xff09;- OpenGL ES - Shader绘制三角形 Android显示系统&#xff08;05&#xff09;- OpenGL…

【工业机器视觉】基于深度学习的水表盘读数识别(4-训练与预测)

【工业机器视觉】基于深度学习的仪表盘识读(读数识别)&#xff08;3&#xff09;-CSDN博客 训练与预测 Ultralytics YOLO指的是由Ultralytics公司开发的一系列基于YOLO&#xff08;You Only Look Once&#xff09;架构的目标检测算法。YOLO是一种实时目标检测系统&#xff0c;它…

C语言——上下弹跳的小球

//上下弹跳的小球 #include<stdio.h> #include<stdlib.h> #include<windows.h> int main() {int i,j;int x5;int y10;int height20;int velocity1; //记录速度的变量while(1) {xxvelocity;system("cls"); //清屏函数for(i0;i<x;i) {printf…

河工oj第七周补题题解2024

A.GO LecturesⅠ—— Victory GO LecturesⅠ—— Victory - 问题 - 软件学院OJ 代码 统计 #include<bits/stdc.h> using namespace std;double b, w;int main() {for(int i 1; i < 19; i ) {for(int j 1; j < 19; j ) {char ch; cin >> ch;if(ch B) b …

如何利用DBeaver配置连接MongoDB和人大金仓数据库

最近根据国产化要求&#xff0c;需要使用国产数据库&#xff0c;但习惯使用DBeaver连接各种成熟的商业或开源数据库。因此&#xff0c;就想着如何继续基于该工具&#xff0c;连接MongoDB和人大金仓数据库&#xff0c;查了半天很多地方说法不统一&#xff0c;所以自己就简单整理…

esp32 OTA学习笔记

csv分区表中ota-0和ota-1存放程序 不超过1600kb的程序可以ota&#xff08;可手动划分&#xff09; 分区表中有 ota0和ota1两个数据分区。 ota是指先下载固件到ota1然后下次从ota1启动&#xff0c;回滚就是回到ota0 启动。 关于固件&#xff1a; bin文件可以用arduino生成也可以…

获得日志记录之外的新视角:应用程序性能监控简介(APM)

作者&#xff1a;来自 Elastic David Hope 日志记录领域即将发生改变。在这篇文章中&#xff0c;我们将概述从单纯的日志记录到包含日志、跟踪和 APM 的完全集成解决方案的推荐流程。 通过 APM 和跟踪优先考虑客户体验 企业软件开发和运营已成为一个有趣的领域。我们拥有一些非…

【Python网络爬虫 常见问题汇总】

目录 1. 爬取图片出现403解决办法&#xff1a;设置请求头中的Referer字段 2.关于干坏事的问题后续不定期更新 欢迎共同探讨学习进步 1. 爬取图片出现403 问题出自案例9&#xff0c;已解决。 【Python网络爬虫笔记】9- 抓取优美图库高清壁纸 当在爬取图库图片时遇到 403 错误…

Redis 数据结构(一)—字符串、哈希表、列表

Redis&#xff08;版本7.0&#xff09;的数据结构主要包括字符串&#xff08;String&#xff09;、哈希表&#xff08;Hash&#xff09;、列表&#xff08;List&#xff09;、集合&#xff08;Set&#xff09;、有序集合&#xff08;Sorted Set&#xff09;、超日志&#xff08…

Docker 安装 Jenkins:2.346.3

准备&#xff1a;已安装Docker&#xff0c;已配置服务器安全组规则 1581 1、拉取镜像 [rootTseng ~]# docker pull jenkins/jenkins:2.346.3 2.346.3: Pulling from jenkins/jenkins 001c52e26ad5: Pull complete 6b8dd635df38: Pull complete 2ba4c74fd680: Pull complet…

学者观察 | Web 3.0生态治理及其安全——北京交通大学副教授李超

导语 李超教授认为Web 3.0中无论是链上治理还是链下治理都有其优劣。链下治理机制更侧重于社区广泛参与和讨论&#xff0c;过程较为繁琐&#xff0c;但能够形成广泛的社区支持和参与&#xff0c;增强决策的合法性和接受度&#xff1b;链上治理机制通过直接在区块链上执行决策&…

RPC设计--应用层缓冲区,TcpBuffer

为什么需要应用层的buffer 为了方便数据处理&#xff0c;从fd上直接读写然后做包的组装、拆解不够方便方便异步发送&#xff0c;将数据写到应用层buffer后即可返回&#xff0c;让epoll即event_loop去异步发送。提高发送效率&#xff0c;多个小包可合并发送 buffer 设计 可以…

QT实战--带行号的支持高亮的编辑器实现(2)

本文主要介绍了第二种实现带行号的支持高亮的编辑器的方式,基于QTextEdit实现的,支持自定义边框,背景,颜色,以及滚动条样式,支持输入变色,复制文本到里面变色,支持替换,是一个纯专业项目使用的编辑器 先上效果图: 1.头文件ContentTextEdit.h #ifndef CONTENT_TEXT_…

Cursor 提示 Too many free trial accounts used on this machine,继续使用方法

Cursor 一直用免费账户&#xff0c;今天使用的时候突然提示&#xff1a; 解决方法&#xff1a; 找到 设备ID 进行重置解决。 位置 $HOME/Library/Application Support/Cursor/User/globalStorage/storage.json 写一个重置脚本&#xff1a; #!/bin/bashgenerate_hex() {loca…

【中间件开发】Redis基础命令详解及概念介绍

文章目录 前言一、Redis相关命令详解及原理1.1 string、set、zset、list、hash1.1.1 string1.1.2 list1.1.3 hash1.1.4 set1.1.5 zset 1.2 分布式锁的实现1.3 lua脚本解决ACID原子性1.4 Redis事务的ACID性质分析 二、Redis协议与异步方式2.1 Redis协议解析2.1.1 redis pipeline…

【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容

目录 1. Introduction&#xff1a;介绍 Registry 的作用和功能。2. Registry Contents&#xff1a;详细描述 Registry 的结构和内容&#xff0c;包括各个部分的条目类型。2.1. DIMSPEC ENTRIES&#xff08;维度规格条目&#xff09;2.2. STATE ENTRIES&#xff08;状态变量条目…

计算机键盘简史 | 键盘按键功能和指法

注&#xff1a;本篇为 “计算机键盘简史 | 键盘按键功能和指法” 相关文章合辑。 英文部分机翻未校。 The Evolution of Keyboards: From Typewriters to Tech Marvels 键盘的演变&#xff1a;从打字机到技术奇迹 Introduction 介绍 The keyboard has journeyed from a humb…