使用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.mzph.cn/news/889231.shtml

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

相关文章

手机租赁系统开发全流程解析与实用指南

内容概要 在如今快速发展的科技时代&#xff0c;手机租赁系统已经成为一种新兴的商业模式&#xff0c;非常符合当下市场需求。那么&#xff0c;在开发这样一个系统的时候&#xff0c;首先要从需求分析和市场调研开始。在这一阶段&#xff0c;你需要了解用户需要什么&#xff0…

unity打包web,如何减小文件体积,特别是 Build.wasm.gz

unity打包WebGL&#xff0c;使用的是wasw&#xff0c;最终生成的Build.wasm.gz体积很大&#xff0c;有6.5M&#xff0c;有几个方法可以稍微减小这个文件的大小 1. 裁剪引擎代码&#xff1a; 此步可将大小从6.5减小到 6.2&#xff08;此项默认开启&#xff0c;只是改了裁剪等级…

字符集编码

由于计算机只能存储和处理二进制的“0”和“1”&#xff0c;无法处理其他的字母、数字和符号&#xff0c;所以就需要有某种东西来达到类似桥梁的作用——例如图1-7中的ASCII——通过它&#xff0c;人们就可以看懂用计算机表示字母、数字或其他符号。 人们能够想到的最直接的方…

OceanBase 社区版 4.0 离线方式升级bp1至bp2 指南(含避坑总结)

注&#xff1a;目前社区版对 4.0 升级 bp1至 bp2也未有完善的文档&#xff0c;本次升级中也是遇到不少坑&#xff0c;写本文也希望对OB感兴趣的可以尝试少些遇坑。 也希望对升级有更好方式建议方式的朋友一起切磋交流&#xff0c;以便再进一步完善升级方案。 第一次做OB的升级&…

基于SSM框架的社区医院管理系统(计算机毕业设计)+万字说明文档

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

视频安防监控平台:Liveweb视频监控管理云平台方案

LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台&#xff0c;可提供多协议&#xff08;RTSP/RTMP/GB28181/海康Ehome/大华&#xff0c;海康SDK等&#xff09;的视频设备接入&#xff0c;支持GB/T28181上下级联&#xff0c;RTSP\RTMP转GB/T28181&#xff0c;云台…

Linux进程概念-详细版(二)

目录 前言&#xff1a; 进程优先级 基本概念 查看系统进程 PRI与NI 查看进程优先级信息 通过top命令更改进程的nice值 通过renice命令更改进程的nice值 四个重要概念 环境变量 基本概念 常见环境变量 查看环境变量的方法 测试PATH 测试HOME 测试SHELL ​编辑 …

前端监控方案sentry整体概览

查看PDF 目****录 1. Sentry介绍 1.1. 编写目的 1.2. 名词定义 2. Sentry监控原理概述 2.1. 常见的性能优化指标及获取方式 2.2. 常见的前端异常及其捕获方式 3. Sentry?整体架构 4. Sentry安装部署 4.1. 前提条件 4.2. 安装 5. Sentry环境配置 5.1. 初始化配置 …

C++11相关知识点

auto、decltype自动类型推导 auto并不代表实际的数据类型&#xff0c;且auto并不是在任何场合下都能推导出变量的实际类型&#xff0c;使用auto必须初始化。 auto 变量名 变量值&#xff1b; 当变量不是指针或引用类型时&#xff0c;推导的结果中不会保留const、volatile关键…

【面试】分布式锁专题

1.你说一下什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一…

Error relaunching VirtualBox VM process: 5 启动虚拟机时发生了错误

出现错误 一大早起来发现虚拟机打不开&#xff0c;看了虚拟机日志是正常的&#xff0c;还回了个档都不行。 最后我突然想起之前在哪看到过&#xff1a;“完美游戏平台会导致虚拟机的问题。” 解决方法 于是我把完美游戏卸载了&#xff0c;发现&#xff0c;真的&#xf…

MCU、ARM体系结构,单片机基础,单片机操作

计算机基础 计算机的组成 输入设备、输出设备、存储器、运算器、控制器 输入设备&#xff1a;将其他信号转换为计算机可以识别的信号&#xff08;电信号&#xff09;。输出设备&#xff1a;将电信号&#xff08;&#xff10;、&#xff11;&#xff09;转为人或其他设备能理解的…

从零开始:如何在.NET Core Web API中完美配置Swagger文档

目录 新建项目 RestFul Swagger配置 注释展示 版本控制 Token传值 方法封装 新建项目 打开visual studio创建新项目&#xff0c;这里我们选择.net core web api模板&#xff0c;然后输入项目名称及其解决方案创建新项目 这里使用配置一些其他信息&#xff0c;根据自己情…

百度搜索应适用中文域名国家标准,修复中文网址展示BUG

12月1日中文域名国家标准正式实施。该标准“明确了中文域名在编码、解析、注册、字表等方面的技术要求&#xff0c;适用于中文域名注册管理机构、注册服务机构、网络软硬件服务商及终端用户”。 00:23 显然&#xff0c;百度作为网络软硬件服务商&#xff0c;是包括在国家标准的…

Windows安装elasticsearch、Kibana以及IK分词器

一、下载 1.下载elasticsearch 访问官网Download Elasticsearch | Elastic&#xff0c;下载elasticsearch 2.下载 Kibana 访问Download Kibana Free | Get Started Now | Elastic &#xff0c;下载 Kibana 3. IK分词器下载 访问Gitee 极速下载/elasticsearch-analysis-ik选…

第一个C++程序--(蓝桥杯备考版)

第一个C程序 基础程序 #include <iostream>//头⽂件 using namespace std;//使⽤std的名字空间 int main()//main函数 {cout << "hello world!" << endl; //输出&#xff1a;在屏幕打印"hello world!" return 0;}main函数 main 函数是…

Elasticsearch Serverless 中的数据流自动分片

作者&#xff1a;来自 Elastic Andrei Dan 在 Elastic Cloud Serverless 中&#xff0c;我们根据索引负载自动为数据流配置最佳分片数量&#xff0c;从而使用户无需摆弄分片。 传统上&#xff0c;用户会更改数据流的分片配置&#xff0c;以处理各种工作负载并充分利用可用资源。…

TcpServer 服务器优化之后,加了多线程,对心跳包进行优化

TcpServer 服务器优化之后&#xff0c;加了多线程&#xff0c;对心跳包进行优化 TcpServer.h #ifndef TCPSERVER_H #define TCPSERVER_H#include <iostream> #include <winsock2.h> #include <ws2tcpip.h> #include <vector> #include <map> #…

python进阶-05-利用Selenium来实现动态爬虫

python进阶-05-利用Selenium来实现动态爬虫 一.说明 这是python进阶部分05&#xff0c;我们上一篇文章学习了Scrapy来爬取网站&#xff0c;但是很多网站需要登录才能爬取有用的信息&#xff0c;或者网站的静态部分是一个空壳&#xff0c;内容是js动态加载的,或者人机验证&…

Linux —— vim 编辑器

一、什么是vim vim是一个功能强大、高度可定制的文本编辑器。以下是对vim编辑器的具体介绍&#xff1a; 历史背景&#xff1a;vim最初由Bram Moolenaar在1991年开发&#xff0c;作为vi编辑器的增强版&#xff0c;增加了许多新的特性和改进。它继承了vi的基本编辑功能和键盘快捷…