17.3.2.3 逆反(内存处理)

2024-02-16 16:52
文章标签 内存 处理 17.3 2.3 逆反

本文主要是介绍17.3.2.3 逆反(内存处理),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

逆反的算法请参看第17.3.1.1节。17.3.1.1 逆反(底片)-CSDN博客

【例 17.41逆反。

        //逆反private void btnInversion_Click(object sender, EventArgs e){//定义目标图片Bitmap destImg = new Bitmap(sourceImg.Width, sourceImg.Height);//定义源BitmapData,锁定区域是整个图片,只需要读取模式,采用24位RGBBitmapData sourceData = sourceImg.LockBits(new Rectangle(0, 0, sourceImg.Width, sourceImg.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);//定义目标BitmapData,锁定区域是整个图片,只需要写入模式,采用24位RGBBitmapData destData  = destImg.LockBits(new Rectangle(0, 0, sourceImg.Width, sourceImg.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);//获得源BitmapData的起始指针位置IntPtr pSource = sourceData.Scan0;//获得源BitmapData占用内存空间的总的字节数int allBytes = sourceData.Stride * sourceData.Height;//定义数组,用来放置源BitmapData的数据byte[] rgbvalues = new byte[allBytes];//把指针位置开始allBytes个字节数据拷贝到rgbvalues()数组中Marshal.Copy(pSource, rgbvalues, 0, allBytes);//数组中第一个字节的序号int pos = 0;int R, G, B;//先高度,后宽度for(int j = 0;j< sourceData.Height;j++){for(int i = 0;i< sourceData.Width;i++){//rgbvalues[pos]对应图片上(i,j)像素对应的蓝色分量值//rgbvalues[pos]对应图片上(i,j)像素对应的绿色分量值//rgbvalues[pos]对应图片上(i,j)像素对应的红色分量值//按照算法进行计算每个颜色分量的值,注意顺序B = 255 - rgbvalues[pos];G = 255 - rgbvalues[pos + 1];R = 255 - rgbvalues[pos + 2];//把求出的各个颜色分量的值写回字节数组rgbvalues[pos] = (byte)B;rgbvalues[pos + 1] = (byte)G;rgbvalues[pos + 2] = (byte)R;//终归是在一维数组里面取数据,向前推进3个字节,注意不用考虑最后的补足字节(即使有)pos = pos + 3;}//一行数据取完了,继续推进到下一行pos = pos + sourceData.Stride - sourceData.Width * 3;}//获得目标BitmapData的起始指针位置IntPtr pDest = destData.Scan0;//将数组的内容拷到pDest指针开始的内存Marshal.Copy(rgbvalues, 0, pDest, allBytes);//不要忘了解锁sourceImg.UnlockBits(sourceData);destImg.UnlockBits(destData);//在图片框显示图片picDest.Image = destImg;}

从以上代码也可以看到使用锁定图像到内存进行处理的步骤:

先是创建了与源图像同样大小的目标图像,然后使用LockBits方法将两个图像都锁定到内存,创建一维字节数组,将内存中源图像数据拷贝到这个一维数组,处理数组,将数组数据拷贝到内存中的目标图像。最后使用UnlockBits解除源图像和目标图像的锁定。

由于采用的算法和像素处理算法一致,所以生成图像相同(下同)。

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看 C# 教程 目录

这篇关于17.3.2.3 逆反(内存处理)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/715138

相关文章

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

Python处理大量Excel文件的十个技巧分享

《Python处理大量Excel文件的十个技巧分享》每天被大量Excel文件折磨的你看过来!这是一份Python程序员整理的实用技巧,不说废话,直接上干货,文章通过代码示例讲解的非常详细,需要的朋友可... 目录一、批量读取多个Excel文件二、选择性读取工作表和列三、自动调整格式和样式四、智能数据清洗五、

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

Python Pandas高效处理Excel数据完整指南

《PythonPandas高效处理Excel数据完整指南》在数据驱动的时代,Excel仍是大量企业存储核心数据的工具,Python的Pandas库凭借其向量化计算、内存优化和丰富的数据处理接口,成为... 目录一、环境搭建与数据读取1.1 基础环境配置1.2 数据高效载入技巧二、数据清洗核心战术2.1 缺失

SpringBoot项目中Redis存储Session对象序列化处理

《SpringBoot项目中Redis存储Session对象序列化处理》在SpringBoot项目中使用Redis存储Session时,对象的序列化和反序列化是关键步骤,下面我们就来讲讲如何在Spri... 目录一、为什么需要序列化处理二、Spring Boot 集成 Redis 存储 Session2.1

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

Python处理超大规模数据的4大方法详解

《Python处理超大规模数据的4大方法详解》在数据的奇妙世界里,数据量就像滚雪球一样,越变越大,从最初的GB级别的小数据堆,逐渐演变成TB级别的数据大山,所以本文我们就来看看Python处理... 目录1. Mars:数据处理界的 “变形金刚”2. Dask:分布式计算的 “指挥家”3. CuPy:GPU

Python中CSV文件处理全攻略

《Python中CSV文件处理全攻略》在数据处理和存储领域,CSV格式凭借其简单高效的特性,成为了电子表格和数据库中常用的文件格式,Python的csv模块为操作CSV文件提供了强大的支持,本文将深入... 目录一、CSV 格式简介二、csv模块核心内容(一)模块函数(二)模块类(三)模块常量(四)模块异常

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、