WinForm中使用Bitmap元素处理图像

news2024/9/20 9:31:05

前言

这个Bitmap元素在我们处理图像显示相关时,它的身影就可以见到了。官方术语:封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。操作对象最重要的两个方法GetPixel和SetPixel。

一、效果

1、光环效果

2、亮度调节

3、彩色转黑白

4、色温反转

5、马赛克

6、扩散效果

二、代码示例

1、光环效果
 if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;

                stopwatch.Restart();

                int width = newbitmap.Width;
                int height = newbitmap.Height;
                float cx = width / 2;
                float cy = height / 2;
                float maxDist = cx * cx + cy * cy;
                float currDist = 0, factor;
                Color pixel;

                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        currDist = ((float)i - cx) * ((float)i - cx) + ((float)j - cy) * ((float)j - cy);
                        factor = currDist / maxDist;

                        pixel = newbitmap.GetPixel(i, j);
                        int red = (int)(pixel.R * (1 - factor));
                        int green = (int)(pixel.G * (1 - factor));
                        int blue = (int)(pixel.B * (1 - factor));
                        newbitmap.SetPixel(i, j, Color.FromArgb(red, green, blue));
                    }
                }

                stopwatch.Stop();
                lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
2、亮度调节
if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                stopwatch.Reset();
                stopwatch.Restart();
                Color pixel;
                int red, green, blue;
                for (int x = 0; x < newbitmap.Width; x++)
                {
                    for (int y = 0; y < newbitmap.Height; y++)
                    {
                        pixel = newbitmap.GetPixel(x, y);
                        red = (int)(pixel.R * 0.6);
                        green = (int)(pixel.G * 0.6);
                        blue = (int)(pixel.B * 0.6);
                        newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
                    }
                }
                stopwatch.Stop();
                lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
3、彩色转黑白
if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                stopwatch.Reset();
                stopwatch.Restart();
                Color pixel;
                int gray;
                for (int x = 0; x < newbitmap.Width; x++)
                {
                    for (int y = 0; y < newbitmap.Height; y++)
                    {
                        pixel = newbitmap.GetPixel(x, y);
                        gray = (int)(0.3 * pixel.R + 0.59 * pixel.G + 0.11 * pixel.B);
                        newbitmap.SetPixel(x, y, Color.FromArgb(gray, gray, gray));
                    }
                }
                stopwatch.Stop();
                lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
4、色温反转
 if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                stopwatch.Restart();
                Color pixel;
                int red, green, blue;
                for (int x = 0; x < newbitmap.Width; x++)
                {
                    for (int y = 0; y < newbitmap.Height; y++)
                    {
                        pixel = newbitmap.GetPixel(x, y);
                        red = (int)(255 - pixel.R);
                        green = (int)(255 - pixel.G);
                        blue = (int)(255 - pixel.B);
                        newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
                    }
                }
                stopwatch.Stop();
                lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
5、马赛克
if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                stopwatch.Reset();
                stopwatch.Restart();
                int RIDIO = 50;//马赛克的尺度,默认为周围两个像素
                for (int h = 0; h < newbitmap.Height; h += RIDIO)
                {
                    for (int w = 0; w < newbitmap.Width; w += RIDIO)
                    {
                        int avgRed = 0, avgGreen = 0, avgBlue = 0;
                        int count = 0;
                        //取周围的像素
                        for (int x = w; (x < w + RIDIO && x < newbitmap.Width); x++)
                        {
                            for (int y = h; (y < h + RIDIO && y < newbitmap.Height); y++)
                            {
                                Color pixel = newbitmap.GetPixel(x, y);
                                avgRed += pixel.R;
                                avgGreen += pixel.G;
                                avgBlue += pixel.B;
                                count++;
                            }
                        }

                        //取平均值
                        avgRed = avgRed / count;
                        avgBlue = avgBlue / count;
                        avgGreen = avgGreen / count;

                        //设置颜色
                        for (int x = w; (x < w + RIDIO && x < newbitmap.Width); x++)
                        {
                            for (int y = h; (y < h + RIDIO && y < newbitmap.Height); y++)
                            {
                                Color newColor = Color.FromArgb(avgRed, avgGreen, avgBlue);
                                newbitmap.SetPixel(x, y, newColor);
                            }
                        }
                    }
                }
                stopwatch.Stop();
                lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString() + " ms";
                pictureBox2.Image = newbitmap.Clone() as Image;
            }
6、扩散效果
if (bitmap != null)
            {
                newbitmap = bitmap.Clone() as Bitmap;
                stopwatch.Reset();
                stopwatch.Restart();
                Color pixel;
                int red, green, blue;
                int flag = 0;
                for (int x = 0; x < newbitmap.Width; x++)
                {
                    for (int y = 0; y < newbitmap.Height; y++)
                    {
                        Random ran = new Random();
                        int RankKey = ran.Next(-5, 5);
                        if (x + RankKey >= newbitmap.Width || y + RankKey >= newbitmap.Height || x + RankKey < 0 || y + RankKey < 0)
                        {
                            flag = 1;
                            continue;
                        }

                        pixel = newbitmap.GetPixel(x + RankKey, y + RankKey);
                        red = (int)(pixel.R);
                        green = (int)(pixel.G);
                        blue = (int)(pixel.B);
                        newbitmap.SetPixel(x, y, Color.FromArgb(red, green, blue));
                    }
                }
                stopwatch.Stop();
                lbTimer.Text = stopwatch.ElapsedMilliseconds.ToString();
                pictureBox2.Image = newbitmap.Clone() as Image;
            }

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

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

相关文章

vscode+cmake+msys2工具链配置

1、msys2下载编译器和cmake工具 pacman -S mingw-w64-x86_64-toolchain pacman -S mingw-w64-x86_64-cmaketoolchain包中包含很多不必要的包&#xff0c;应该可以指定具体的工具g&#xff0c;gcc&#xff0c;mingw32-make的下载&#xff0c;详细命令请自行搜索。 2、将 msys2…

前端面试宝典【HTML篇】【3】

欢迎来到《前端面试宝典》,这里是你通往互联网大厂的专属通道,专为渴望在前端领域大放异彩的你量身定制。通过本专栏的学习,无论是一线大厂还是初创企业的面试,都能自信满满地展现你的实力。 核心特色: 独家实战案例:每一期专栏都将深入剖析真实的前端面试案例,从基础知…

开源=最强大模型!Llama3.1发布,405B超越闭源GPT-4o,扎克伯格:分水岭时刻

刚刚&#xff0c;LIama 3.1正式发布&#xff0c;登上大模型王座&#xff01; 在150多个基准测试集中&#xff0c;405B版本的表现追平甚至超越了现有SOTA模型GPT-4o和Claude 3.5 Sonnet。 也就是说&#xff0c;这次&#xff0c;最强开源模型即最强模型。 在此之前&#xff0c;…

零基础入门转录组数据分析——机器学习算法之xgboost(筛选特征基因)

零基础入门转录组数据分析——机器学习算法之xgboost&#xff08;筛选特征基因&#xff09; 目录 零基础入门转录组数据分析——机器学习算法之xgboost&#xff08;筛选特征基因&#xff09;1. xgboost基础知识2. xgboost&#xff08;Rstudio&#xff09;——代码实操2. 1 数据…

第N高的薪水 [sql]

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGINset N N - 1;RETURN (# Write your MySQL query statement below.select distinct salary from Employee order by salary desc limit 1 offset N); END

VSCode使用conda虚拟环境配置

如何解决CondaError: Run ‘conda init‘ before ‘conda activate‘_condaerror: run conda init before conda activat-CSDN博客 首先检查自己的anaconda是否是添加到整个的环境变量里了 打开cmd如果conda和python都能够识别那么就是配置成功了 然后看插件是否安装&#xf…

1个惊艳的Python项目火出圈,已开源,10K stars!

本次分享一个Python工具Taipy:“To build data & AI web applications in no time”。 Taipy专为数据科学家和机器学习工程师设计,用于构建数据和AI的Web应用程序。 快速构建可投入生产的Web应用程序。无需学习HTML、CSS、JS等新前端语言,只需使用Python。专注于数据和A…

抖音短视频矩阵系统优势:为何选择短视频矩阵系统?

1. 抖音短视频矩阵系统 抖音短视频矩阵系统&#xff0c;是指通过抖音平台&#xff0c;以矩阵的形式进行短视频创作、发布和传播的一种模式。它以多样化的内容、丰富的表现形式、高度的专业化和协同性&#xff0c;吸引了大量用户和创作者的关注。 2. 短视频矩阵系统的优势 2.…

jdk和tomcat的环境配置以及使用nginx代理tomcat来实现负载均衡

目录 1.jdk环境配置 1.jdk下载 2.解压 3.将jdk-22.2移动到指定目录/usr/local/jdk22/下 4.配置文件 5.运行profile 6.测试 2.tomcat环境配置 1.下载tomcat 2.解压 3.将解压后的文件移动指定目录 4.启动tomcat 5.查看端口确定是否确定成功 6.测试 7.tomcat目录 1…

<数据集>航拍人车识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;9695张 标注数量(xml文件个数)&#xff1a;9695 标注数量(txt文件个数)&#xff1a;9695 标注类别数&#xff1a;4 标注类别名称&#xff1a;[car, pedestrian, truck, bus] 序号类别名称图片数框数1car923525710…

GIT如何将远程指定分支的指定提交拉回到本地分支

一、当前我的代码在这个提交&#xff0c;但可以看到远程仓库上面还有两次新的提交 二、现在我想让我本次的代码更新到最上面这个最新的提交 三、输入git fetch命令获取远程分支的最新提交信息。 四、输入 git log origin/<remote_branch_name>查看并找到想要更新的指定提…

Reat hook开源库推荐

Channelwill Hooks 安装 npm i channelwill/hooks # or yarn add channelwill/hooks # or pnpm add channelwill/hooksAPI 文档 工具 Hooks useArrayComparison: 比较两个数组的变化。useCommunication: 处理组件之间的通信。useCurrencyConverter: 货币转换工具。useCurre…

【SRC挖掘】众测下的SQL注入挖掘案例

众测下的SQL注入挖掘 众测下的SQL注入挖掘0x01原理&#xff1a;0x02测试方法&#xff1a;常用手法&#xff1a;注入存在点&#xff1a; 0x03案例&#xff1a;总结 众测下的SQL注入挖掘 0x01原理&#xff1a; sql注入的原理在这里就不在详细介绍了&#xff0c;我相信大多数师傅…

MySQL数据库 外键默认约束和action 基础知识【2】推荐

数据库就是储存和管理数据的仓库&#xff0c;对数据进行增删改查操作&#xff0c;其本质是一个软件。MySQL就是一种开源的关系型数库&#xff0c;也是最受欢迎的数据库之一&#xff0c;今天对MySQL数据的基础知识做了整理&#xff0c;方便自己查看&#xff0c;也欢迎正在学习My…

DITA的优点和缺点

作者 | Stefan Jung DITA的实施可能是一项复杂的任务&#xff0c;本节列出了在实施DITA之前需要了解它的优缺点。 - 1 - 优点 开放标准 被很多公司采用 可以与版本控制系统一起使用&#xff0c;比如&#xff1a;Git 可扩展&#xff0c;可以从文件系统开始&#xff0c;稍后…

openGauss 5.0 LTS部署至华为云ECS CentOS8.2实操教程

一、前言 openGauss是一款高可靠、高性能、高安全、易运维的开源关系型数据库管理系统&#xff0c;然而其全功能部署对系统要求非常高。 本实操教程能够使个人开发者以及高校师生能够以成本最小的方式快速将openGauss部署到华为云的ECS上&#xff0c;以便快速进行功能验证以及…

C#(asp.net)电商后台管理系统-计算机毕业设计源码70015

摘 要 随着互联网技术的不断发展&#xff0c;电商行业也越来越受到人们的关注。为了提高电商行业的管理效率和服务水平&#xff0c;本文提出了一种基于ASP.NET电商后台管理系统的设计与实现方案。 电商管理系统基于VisualStudio开发平台&#xff0c;采用C#编程语言和ASP.NET等技…

使用 ModelScope 本地部署图片变视频模型

最近在抖音上看到很多视频可以让图片动起来&#xff0c;搜了一下&#xff0c;stabilityai/stable-video-diffusion-img2vid-xt 这个模型可以实现图片到视频&#xff0c;可以生成 25 帧的视频。Kling 和 Runway 都支持从图片生成视频&#xff0c;本文将通过 ModelScope 搭建一个…

如何下载Maven指定版本

下载Maven指定版本的步骤如下&#xff1a;‌ 1.访问Maven官网&#xff1a;‌首先&#xff0c;‌需要访问Maven的官方网站&#xff0c;‌即https://maven.apache.org/。‌ 2.选择下载链接&#xff1a;‌在官网首页&#xff0c;‌找到“Download”选项并点击进入下载页面。‌ …

你真的懂二分吗?

二分简述&#xff1a; 二分算法&#xff0c;又称为二分搜索或折半搜索&#xff0c;是一种在有序数组中查找特定元素的搜索算法。其基本思想是将数组分成两半&#xff0c;然后根据目标值与中间元素的大小关系来决定是继续在左侧还是右侧进行搜索。这个过程会不断重复&#xff0…