C#中的图像处理(附带生成马赛克范例)

C# BitmapData使用 阅读详情
C#中可以利用非安全指针对位图进行处理,下面利用MSDN的一个例子进行讲解:
Bitmap bmp = new Bitmap("c://fakePhoto.jpg");

//读取本地图像

Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
System.Drawing.Imaging.BitmapData bmpData = 
bmp.LockBits(rect,    System.Drawing.Imaging.ImageLockMode.ReadWrite,
bmp.PixelFormat);
 
//BitmapData 指定 Bitmap 的属性,如大小、像素格式、像素数据在内存中的始地址以及每个扫描行的长度(步幅)。
//lockbit将位图锁定到内存中,这样做主要是增加效率,如果速度不是主要因素的话,建议使用bitmap的setpixel和getpixel方法,省去了使用不安全指针的麻烦。
 
IntPtr ptr = bmpData.Scan0;
//Scan0 获取或设置位图中第一个像素数据的地址。它也可以看成是位图中的第一个扫描行。简言之就是把当前指针设置在图像最左上角的位置。 
 
 
int bytes = bmp.Width * bmp.Height * 3;
byte[] rgbValues = new byte[bytes];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
  
for (int counter = 0; counter < rgbValues.Length; counter+=3)
        rgbValues[counter] = 255;
  
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
//将数据从托管数组复制到非托管内存指针,或从非托管内存指针复制到托管数组,此处为前者。
 
 
bmp.UnlockBits(bmpData);
//解锁
  
e.Graphics.DrawImage(bmp, 0, 150);
想对lockbit有所了解的同学可以看《Using the LockBits method to access image data》。
下面附上一个实例,其中原理是凭着研一时的数字图像处理课。
马赛克范例

很多图片处理的算法从原理上讲其实非常简单,难点往往在如何去写算法实现它,更加难的就是如何去优化实现的算法。

马赛克算法很简单,说白了就是把一张图片分割成若干个val * val像素的小区块(可能在边缘有零星的小块,但不影响整体算法),每个小区块的颜色都是相同的。为了方便起见,我们不妨让这个颜色就用该区域最左上角的那个点的颜色。当然还可以有其他方法,比如取区块中间点的颜色,或区块中随机点的颜色作代表等等。

下面的示意图就是取val=2的结果。

原图像素
ABCDEFG
HIJKLMN   
OPQRSTU   
VWXYZ01   
2345678   

马赛克处理后
AACCEEG
AACCEEG
OOQQSSU
OOQQSSU
2244668

 

        public static Bitmap KiMosaic(Bitmap b, int val)
        {
            if (b.Equals(null))
            {
                return null;
            }

            int w = b.Width;
            int h = b.Height;

            int stdR, stdG, stdB;

            stdR = 0;
            stdG = 0;
            stdB = 0;

            BitmapData srcData = b.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

            unsafe
            {
                byte* p = (byte*)srcData.Scan0.ToPointer();

                for (int y = 0; y < h; y++)
                {
                    for (int x = 0; x < w; x++)
                    {
                        if (y % val == 0)
                        {
                            if (x % val == 0)
                            {
                                stdR = p[2]; stdG = p[1]; stdB = p[0];
                            }
                            else
                            {
                                p[0] = (byte)stdB;
                                p[1] = (byte)stdG;
                                p[2] = (byte)stdR;
                            }
                        }
                        else
                        {
                            // 复制上一行
                            byte * pTemp = p - srcData.Stride;

                            p[0] = (byte)pTemp[0];
                            p[1] = (byte)pTemp[1];
                            p[2] = (byte)pTemp[2];
                        }

                        p += 3;

                    } // end of x

                    p += srcData.Stride - w * 3;

                } // end of y

                b.UnlockBits(srcData);
            }

            return b;

        }

 

先上原图:

C#中的图像处理(附带生成马赛克范例)

 

再上效果图

C#中的图像处理(附带生成马赛克范例)

 

使用C#进行图像处理 使用C#进行图像处理 前言 之前一直认为图像处理是一件很高大上的事情,在一门选修课的课上遇到一个图像处理的作业,上手几个简单的图像处理的算法,也算是入了个最简单的门。 界面简单而又丑陋,代码命名也比较随意,大家重点关注算法就好 在这里一共实现了暗角、降低亮度、灰度、浮雕、马赛克、扩散六个算法。 项目github地址:https://github.com/wchstrife/Image 阅读详情

相关推荐

C#图像处理

前言: 在之前的博客中讲到了用C#实现直方图均衡化的具体过程, 直方图均衡化 由于学校课程要求,在之前的基础上我对之前的程序进行了版本的更新, 得到一个更加完整,美观的版本! 前后对比: V1.0界面: 实现功能:直方图均衡化 V2.0界面: 实现功能: 均衡化,暗角,马赛克,去色,底片,扩散,降低亮度,镜像; 图片浏览; 图片清除; 动画启动。 代码文件结构: ...

define_LIN的博客 2009

C#中使用LockBits、UnlockBits

C#中使用LockBits、UnlockBits

wangnaisheng的专栏 1017

c#图像处理超酷效果(附有例程)

alimama_pid="mm_10249644_1605763_4929893"; alimama_titlecolor="0000FF"; alimama_descolor ="000000"; alimama_bgcolor="FFFFFF"; alimama_bordercolor="E6E6E6"; alimama_linkcolor="008000"; a

1万+

C#的Bitmap.LockBits 使用说明

本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。 翻译 英语 Bitmap.LockBits 方法 (Rectangle, ImageLockMode, PixelFormat) .NET Framework (current version) 其他版本

无敌三脚猫的专栏 1万+

Unity图像处理:RAW数据去马赛克算法实战与UniversalUnityDemosaics库详解

在数字图像处理领域,去马赛克是将单通道拜耳阵列RAW数据转换为全彩RGB图像的核心技术。其原理是通过插值算法,根据每个像素点记录的单一颜色信息,重建出完整的红、绿、蓝三通道数据。这项技术对于从相机传感器获取可视图像至关重要,直接影响图像的色彩还原与细节清晰度。在计算机视觉、专业摄影和实时渲染等应用场景中,高效、高质量的去马赛克是基础且关键的环节。本文聚焦于在Unity引擎中实现这一过程,深入解析了双线性插值、平滑色调渐变等经典算法,并介绍了专为Unity生态优化的UniversalUnityDemosaic

weixin_29628635的博客 306

Unity图像处理实战:集成开源Demosaicing插件实现Bayer阵列去马赛克

在计算机视觉和图像处理领域,原始图像数据的处理是基础且关键的环节。许多彩色图像传感器采用Bayer阵列,每个像素仅捕获单一颜色信息,需要通过去马赛克算法重建完整RGB图像。这一过程涉及插值、色彩重建等核心原理,直接影响图像质量和后续分析。在Unity引擎中,处理这类原始数据常面临管线缺失的挑战。本文聚焦于开源项目UniversalUnityDemosaics,它提供了高质量的去马赛克算法集成方案。通过解析其配置流程、渲染管线适配及性能优化,为AR/VR、工业检测等应用场景提供了一套可实践的工程解决方案,帮助

weixin_33672400的博客 330

给图像马赛克处理的程序c语言,C#中的图像处理(附带生成马赛克范例)

很多图片处理的算法从原理上讲其实非常简单,难点往往在如何去写算法实现它,更加难的就是如何去优化实现的算法。马赛克算法很简单,说白了就是把一张图片分割成若干个val * val像素的小区块(可能在边缘有零星的小块,但不影响整体算法),每个小区块的颜色都是相同的。为了方便起见,我们不妨让这个颜色就用该区域最左上角的那个点的颜色。当然还可以有其他方法,比如取区块中间点的颜色,或区块中随机点的颜色作代表等...

weixin_29230865的博客 869

图像数据读取LockBits理解

Many image processing tasks and even file type conversions, say from 32 bit-per-pixel to 8 bit-per-pixel can be speeded up by accessing the pixel data array directly, rather than relying on GetPixel and SetPixel or other methods.You will be aware that .NET

松子茶的专栏 4356

C#图像处理:加马赛克

【代码】C#图像处理:加马赛克。

半块菠萝的博客 385

马赛克效果实现与API集成:图像处理技术实战

在数字图像处理领域,马赛克效果是一个广泛使用的图像编辑技术,它通过特定算法对图像进行处理,从而达到遮挡信息、突出主题或者创造艺术效果的目的。马赛克API作为一种高效的工具,使得开发者可以在自己的应用中轻松集成这一图像处理技术。本章将对马赛克API进行基础介绍,包括其应用场景、功能特点和安装配置等,为读者进一步探索和应用马赛克API打下坚实的基础。马赛克技术是图像处理中的一种常见操作,其基本思想是通过修改图像中的某些像素信息,来达到模糊或者遮盖特定区域的目的。

weixin_34535286的博客 981

使用C#的BitmapData

最近要转开发平台,正研究C#。C#好是好,不过处理图片时一个像素一个像素的操作像素不是一般的慢。其实Delphi也一样,但好在Delphi的Bitmap类提供了ScanLines,可以一行一行的读图,效率比较高。C#应该也有类似的东东。经过一番搜索,终于发现了C# BitmapData类。

c#图像处理的简单算法

原文链接:https://blog.youkuaiyun.com/wchstrife/article/details/78984735 使用C#进行图像处理前言之前一直认为图像处理是一件很高大上的事情,在一门选修课的课上遇到一个图像处理的作业,上手几个简单的图像处理的算法,也算是入了个最简单的门。 界面简单而又丑陋,代码命名也比较随意,大家重点关注算法就好 在这里一共实现了暗角、降低亮度、灰...

weixin_30437337的博客 263

现代SerDes解剖:从CTLE/DFE到PAM4与ADC+DSP架构

高速有线通信的物理层瓶颈,正从并行总线的时钟偏斜转向串行链路的信号完整性挑战。SerDes作为解决这一问题的核心技术,其内部架构远超“并转串”的朴素认知。接收端的CTLE线性均衡与DFE判决反馈均衡,配合CDR时钟恢复,共同构成对抗信道损耗与码间干扰的关键机制。随着速率迈向56G/112G,PAM4调制以电平幅度换取带宽,而ADC+DSP架构则把均衡算法搬入数字域,实现更灵活的非线性补偿。理解这些模块如何协同工作,是调试PCIe、以太网等高速链路、优化眼图余量与抖动预算的基础,也是硬件工程师从盲目调参走向系

weixin_29194817的博客 299

C# 图片进行马赛克处理

MosaicHelper.AdjustTobMosaic( @"C:\Users\xxxue\Desktop\QQ图片2...

dibr63585的博客 850

四旋翼无人机Matlab建模

本文主要分享一下四旋翼无人机的建模过程,然后在Matlab的simulink模块搭建起四旋翼无人机的模型,下一章将结合这个模型设计双环PID控制器并调节参数。 一、无人机建模过程

qq_36903625的博客 3万+

process插件_利用SPSS 插件MLmed检验多水平中介的调节模型

本文介绍一个SPSS插件,用于检验多水平中介的调节,及该方法与Mplus的比较。1 Mlmed 简介及安装Mlmed 简介: Mlmed 由Rockwood 2017年开发,基于SPSS插件计算Multilevel moderated mediation. 可以提供multilevel mediation Monte Carlo 置信区间比如(模拟20000次),以及多水平调节的...

weixin_39976081的博客 5774

马赛克算法

public static Bitmap KiMosaic(Bitmap b, int val) { if (b.Equals(null)) { return null; } int w = b.Width; int h = b.Height; int stdR, stdG, std

菩提树上的专栏 2645

LightTools 中LCD投影仿真的checkerboard pattern偏振控制技术解析

本文深入解析了在LightTools软件中进行LCD投影仿真时,利用checkerboard pattern(棋盘格图案)结合偏振控制技术来模拟液晶面板像素开关、提升图像对比度的核心方法。文章从实战角度出发,详细拆解了通过设置波片(如1/2波片)和偏振片来操控S光与P光转换的原理,并分享了在LightTools中搭建仿真模型、使用VBA脚本自动化配置参数以提高效率的实用技巧,为光学工程师优化投影系统仿真流程提供了清晰指导。

weixin_29305313的博客 344

分享一段C#使用指针的代码!! 马赛克效果

来自:http://bbs.youkuaiyun.com/topics/360146578 这效果你懂的。 这段代码使用了不安全代码,用了指针,要运行需要更改VS配置,Google下。看代码和效果: /// /// 马赛克效果 ///原理:确定图像的随机位置点和确定马赛克块的大小,然后马赛克块图像覆盖随机点即可. /// ///

码农 1223

海洋与地质地理信息数据下载网站汇总集锦

各种海洋与地质地理信息数据集合

qq_36980284的博客 1268

Unity中5分钟实现3D高斯泼溅渲染:从原理到实战部署

3D高斯泼溅(3D Gaussian Splatting)是一种新兴的神经渲染技术,它通过显式地使用大量3D高斯椭球来表示场景,革新了传统的体渲染和神经辐射场(NeRF)方法。其核心原理是将这些3D高斯投影到2D屏幕并进行快速光栅化与Alpha混合,从而绕过了耗时的光线步进,实现了极高的渲染效率。这项技术的价值在于,它能够在消费级GPU上达到实时甚至超实时的帧率,同时保持紧凑的数据表达和惊人的视觉细节,极大地降低了高质量3D重建与渲染的门槛。在应用场景上,它正快速渗透到数字孪生、虚拟现实、文化遗产数字化以及

weixin_29474431的博客 274

“手把手教你制作P图软件”:使用C#进行图像处理

1、安装System.Drawing.Common NuGet包:在Visual Studio中,通过NuGet包管理器安装System.Drawing.Common。使用Nuget程序包中的System.Drawing.Common2、在Form设计界面布置P图界面,如加入图片文件的Picturebox1控件,处理图片后显示图片的Picturebox2控件。3、将openFileDialog控件,saveFileDialog控件拖入设计界面。

m0_74242582的博客 2239

实测!Gemini+ChatGPT赋能学术写作:我的论文写作SOP(附提示词)

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。为什么ChatGPT逻辑清晰却写不长?为什么Gemini能深入分析但废话连篇?这其实是两种模型架构的本质差异,GPT系列擅长指令跟随和语言精炼,而Gemini原生支持超长上下文,适合深度文本生成。两者在深度生成与精炼表达上形成了天然互补。我们可以将它们组合起来使用发挥他们各自的特长。

智能AI让学术科研更容易 521
上一篇: 使用托管C++粘合C#和C++代码(二)
下一篇: C#中使用lockbits方法处理图像(译文)
风羿wy
博客等级 码龄18年 297粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值