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

news2024/12/12 18:08:15

此示例产生了一些令人印象深刻的结果,但实际上非常简单。
它使用其他几个示例演示的 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.coloradmin.cn/o/2258354.html

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

相关文章

SQL 在线格式化 - 加菲工具

SQL 在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql&#xff0c;点击上方的格式化按钮即可 输入框得到格式化后的sql结果

AI作图效率高,亲测ToDesk、顺网云、青椒云多款云电脑AIGC实践创作

一、引言 随着人工智能生成内容&#xff08;AIGC&#xff09;的兴起&#xff0c;越来越多的创作者开始探索高效的文字处理和AI绘图方式&#xff0c;而云电脑也正成为AIGC创作中的重要工具。相比于传统的本地硬件&#xff0c;云电脑在AIGC场景中展现出了显著的优势&#xff0c;…

【密码学】SM4算法

一、 SM4算法简介 SM4算法是中国国家密码管理局于2012发布的一种分组密码算法&#xff0c;其官方名称为SMS4&#xff08;SMS4.0&#xff09;&#xff0c;相关标准为GM/T 0002-2012《SM4分组密码算法》。SM4算法的分组长度和密钥长度均为128比特,采用非平衡Feistel结构。采用32…

Proteus(8.15)仿真下载安装过程(附详细安装过程图)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、Proteus是什么&#xff1f; 二、下载链接 三、下安装步骤 1.解压&#xff0c;有键管理员运行 2.点击Next&#xff0c;进行下一步 3.勾选I accept…&#…

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

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

AlphaPose、yolov8Pose、RTMPose进行对比

一、Alphapose 参考&#xff1a; https://blog.csdn.net/m0_45850873/article/details/123939849

MongoDB-ObjectID 生成器

前言 MongoDB中一个非常关键的概念就是 ObjectID&#xff0c;它是 MongoDB 中每个文档的默认唯一标识符。了解 ObjectID 的生成机制不仅有助于开发人员优化数据库性能&#xff0c;还能帮助更好地理解 MongoDB 的设计理念。 什么是 MongoDB ObjectID&#xff1f; 在 MongoDB …

ARM学习(36)静态扫描规则学习以及工具使用

笔者来学习了解一下静态扫描以及其规则,并且亲身是实践一下对arm 架构的代码进行扫描。 1、静态扫描认识 静态扫描:对代码源文件按照一定的规则进行扫描,来发现一些潜在的问题或者风险,因为不涉及代码运行,所以其一般只是发现一些规范或则一些质量问题,当然这些可能存在潜…

从 Zuul 迁移到 Spring Cloud Gateway:一步步实现服务网关的升级

从 Zuul 迁移到 Spring Cloud Gateway&#xff1a;一步步实现服务网关的升级 迁移前的准备工作迁移步骤详解第一步&#xff1a;查看源码第二步&#xff1a;启动类迁移第三步&#xff1a;引入 Gateway 依赖第四步 编写bootstrap.yaml第五步&#xff1a;替换路由配置第六步&#…

centos部署SkyWalking并在springcloud项目中用法举例

文章目录 场景SkyWalking介绍部署部署Storage [单机版Elasticsearch]部署SkyWalking OAP [下载地址](https://skywalking.apache.org/downloads/#SkyWalkingAPM)部署SkyWalking Java Agent springCloud 使用举例 场景 SkyWalking是应用性能监控平台&#xff0c;可用于分布式系统…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆&#xff0c;用以运送各种汽油、柴油、原油等油品&#xff0c;运输危险系数大&#xff0c;而且由于油罐车需要经常行驶在城区道路&#xff0c;为城市各个加油站点、企业工厂运输补充所需油料&#xff0c;因此也是危化品运输车辆的重点监测和管控对象…

【总结·反思·汇报·思考02】裸辞后,我的一些感想和感悟。

Hello&#xff0c;大家好&#xff01; 首先&#xff0c;我需要向大家道个歉&#xff0c;对不起&#xff01;因为最近发生了一些事情&#xff0c;博客文章一直没有更新。&#xff08;90度鞠躬道歉&#xff09; 那么&#xff0c;最近到底发生了什么呢&#xff1f;相信大家已经从…

李宏毅机器学习-局部最小值与鞍点

一、Optimization Fails because …… 1&#xff0e; 问题 在optimization时&#xff0c;training的loss不会再下降&#xff0c;但是我们对loss并不满意。不管我们怎么更新参数&#xff0c;loss都不会掉下来。 2&#xff0e; 原因&#xff1a;critical point&#xff08;gra…

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元件、组…

STM32软件IIC驱动TCA9548A多路测量AHT10

STM32软件IIC驱动TCA9548多路测量AHT10 TCA9548AAHT10代码逻辑代码展示现象总结 TCA9548A TCA9548A 有八个可通过 I2C 总线控制的双向转换开关&#xff0c;SCL/SDA 上行对扩展到八个下行对&#xff0c;或者通道&#xff0c;适用于系统中存在I2C目标地址冲突的情况。8路双向转换…

鸿蒙调试打包(非正式打包)

文章目录 前言第一步&#xff1a;生成.p12和.csr文件第二步&#xff1a;申请证书的前置步骤第三步&#xff1a;申请证书 前言 HarmonyOS 应用打包后的文件为.app 格式&#xff0c; android 打包后的文件为.apk&#xff0c;IOS 打包后的文件为.apa HarmonyOS通过数字证书&#…

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

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

C++是如何工作的?

首先来看一个最基本的C程序段。 #include <iostream>int main() {std::cout << "HelloWorld" << std::endl;std::cin.get(); } 第一行 #include 的含义是预处理的意思&#xff0c;这条语句的作用是将一个名为iostream的文件拷贝到源代码中这个…

在 Windows WSL 上部署 Ollama 和大语言模型:从镜像冗余问题看 Docker 最佳实践20241208

&#x1f6e0;️ 在 Windows WSL 上部署 Ollama 和大语言模型&#xff1a;从镜像冗余问题看 Docker 最佳实践 ⭐ 引言 随着大语言模型&#xff08;LLM&#xff09;和人工智能技术的迅猛发展&#xff0c;开发者们越来越多地尝试在本地环境中部署模型进行实验。 但部署过程中常…

2、开发环境优化与创建第一个插件程序

一、创建测试用例二、vscode优化2.1 修改默认终端为普通cmd2.2 配置一键编译&&运行&&监视一、创建测试用例 使用命令yo code生成一个测试用例,选择或输入下面的内容。2. 命令的最后会提示是否使用vscode打开,选择打开就行。 3. 在当前目录下会产生helloworld…