广告
返回顶部
首页 > 资讯 > 精选 >C#中如何实现Bitmap图像处理加速
  • 158
分享到

C#中如何实现Bitmap图像处理加速

2023-06-25 15:06:21 158人浏览 薄情痞子
摘要

这篇文章主要讲解了“C#中如何实现Bitmap图像处理加速”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中如何实现Bitmap图像处理加速”吧!BitmapData类BitmapData

这篇文章主要讲解了“C#中如何实现Bitmap图像处理加速”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中如何实现Bitmap图像处理加速”吧!

BitmapData类

BitmapData类专门用于位图处理,与Bitmap的不同点在于,它使用指针直接修改内存,而Bitmap是使用SetPixel()方法间接修改颜色,因此其效率远远超过SetPixel()

传统代码

以灰度处理为例,为了便于演示,此处的灰度算法采用 Gray=(R+G+B) / 3

private void Gray_Tradition(){    for(int i = 0; i < bitmap.Width; i++)    {        for(int j = 0; j < bitmap.Height; j++)        {            Color color = bitmap.GetPixel(i, j);            int RGB = (color.R + color.G + color.B) / 3;            bitmap.SetPixel(i, j, Color.FromArgb(255, RGB, RGB, RGB));        }    }}

使用BitmapData的代码

private void Gray_BitmapData(){    int width = bitmap.Width, height = bitmap.Height;//图片的宽度和高度    //在内存中以读写模式定Bitmap    BitmapData bitmapData = bitmap.LockBits(    new Rectangle(0, 0, width, height),    ImageLockMode.ReadWrite,    PixelFORMat.Format24bppRgb);    //图片像素点数组的长度,由于一个像素点占了3个字节,所以要乘上3    int size = width * height * 3;    //缓冲区数组    byte[] srcArray = new byte[size];    //获取第一个像素的地址    IntPtr ptr = bitmapData.Scan0;    //把像素值复制到缓冲区    Marshal.Copy(ptr, srcArray, 0, size);    int p;    for (int i = 0; i < width; i++)    {        for (int j = 0; j < height; j++)        {            //定位像素点位置            p = j * width * 3 + i * 3;            //计算灰度值            byte color = (byte)((srcArray[p] + srcArray[p + 1] + srcArray[p + 2]) / 3);            srcArray[p] = srcArray[p + 1] = srcArray[p + 2] = color;        }    }    //从缓冲区复制回BitmapData    Marshal.Copy(srcArray, 0, ptr, size);    //从内存中解锁    bitmap.UnlockBits(bitmapData);}

效率对比

代码

private void onTest(){    double t1, t2;    Stopwatch watch = new Stopwatch();    watch.Start();    Gray_BitmapData();    watch.Stop();    t1 = watch.Elapsed.TotalMilliseconds;    watch.Reset();    watch.Start();    Gray_Tradition();    watch.Stop();    t2 = watch.Elapsed.TotalMilliseconds;    MessageBox.Show("BitmapData=" + (long)t1 + "\nTradition=" + (long)t2);}

图片信息

C#中如何实现Bitmap图像处理加速

耗时

C#中如何实现Bitmap图像处理加速

可以看到传统方法的耗时是使用BitmapData方法的106倍,需要整整14秒,而BitmapData仅用了0.1秒

GPU加速

使用CUDA生成dll后,可以在GPU上高效处理图像,但是这种方式需要使用dll,而且异常繁琐,因此只适合对效率有极高要求时使用

生成Dll

#include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h>#include <windows.h> __global__ void DoInKernel(byte* o, int num){    int i = blockIdx.x * blockDim.x + threadIdx.x;    if (i >= num) return;    byte* ori = o + i * 3;    ori[0] = ori[1] = ori[2] = (ori[0] + ori[1] + ori[2]) / 3;} extern "C" _declspec(dllexport) void Gray(byte * oriArray, int num) {    int size = num * 3 * sizeof(byte);    byte* dev_ori;    //在GPU上分配内存    cudaMalloc((void**)&dev_ori, size);    //把数组复制到显存    cudaMemcpy(dev_ori, oriArray, size, cudaMemcpyHostToDevice);    //计算    DoInKernel << <num / 1024 + 1, 1024 >> > (dev_ori, num);    //从显存复制到内存    cudaMemcpy(oriArray, dev_ori, size, cudaMemcpyDeviceToHost);    //释放    cudaFree(dev_ori);}

实际上GPU的thread和block数量应该根据实际数组大小来动态调整,但是这里为了演示方便,直接定义1024个线程

调用Dll

[DllImport("CUDA.dll", EntryPoint = "Gray", CallinGConvention = CallingConvention.Cdecl)]public static extern void Gray(IntPtr ori, int num);

此时不需要定义缓冲区数组了,可以直接把数据复制到显存中使用

private void Gray_GPU(){    int width = bitmap.Width, height = bitmap.Height;//图片的宽度和高度    //在内存中以读写模式锁定Bitmap    BitmapData bitmapData = bitmap.LockBits(    new Rectangle(0, 0, width, height),    ImageLockMode.ReadWrite,    PixelFormat.Format24bppRgb);    //图片像素点数组的长度,由于一个像素点占了3个字节,所以要乘上3    int size = width * height * 3;    //获取第一个像素的地址    IntPtr ptr = bitmapData.Scan0;    Gray(ptr, width * height);    //从内存中解锁    bitmap.UnlockBits(bitmapData);    pictureBox1.Refresh();}

耗时

由于加载dll需要时间,因此第二次执行的耗时才是真正的GPU执行时间 

C#中如何实现Bitmap图像处理加速

 仅用了34毫秒

感谢各位的阅读,以上就是“C#中如何实现Bitmap图像处理加速”的内容了,经过本文的学习后,相信大家对C#中如何实现Bitmap图像处理加速这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: C#中如何实现Bitmap图像处理加速

本文链接: https://www.lsjlt.com/news/305629.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#中如何实现Bitmap图像处理加速
    这篇文章主要讲解了“C#中如何实现Bitmap图像处理加速”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中如何实现Bitmap图像处理加速”吧!BitmapData类BitmapData...
    99+
    2023-06-25
  • C# Bitmap图像处理加速的实现
    目录BitmapData类传统代码使用BitmapData的代码效率对比代码GPU加速生成Dll调用Dll耗时BitmapData类 BitmapData类专门用于位图处理,与Bit...
    99+
    2022-11-12
  • OpenMV如何实现图像处理
    这篇文章主要为大家展示了“OpenMV如何实现图像处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“OpenMV如何实现图像处理”这篇文章吧。一、图像处理基础知识摄像头:光学信号转换成电信号。计...
    99+
    2023-06-25
  • C++ opencv图像处理实现图像腐蚀和膨胀示例
    目录1 概念2 膨胀3 腐蚀1 概念 1.1 腐蚀跟膨胀是最基本的形态学运算 1.2 腐蚀跟膨胀是对图像的白色的部分(亮光部分)进行操作 1.3 腐蚀是对亮光部分进行腐蚀 拥有比原图...
    99+
    2022-11-13
  • C语言实现BMP图像细化处理
    细化(thinning)算法有很多,我们在这里介绍的是一种简单而且效果很好的算法,用它就能够实现从文本抽取骨架的功能。我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用 ...
    99+
    2022-11-12
  • C++ opencv图像处理怎么实现图片几何变换
    本文小编为大家详细介绍“C++ opencv图像处理怎么实现图片几何变换”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++ opencv图像处理怎么实现图片几何变换”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入...
    99+
    2023-06-30
  • C++opencv图像处理实现图片几何变换示例
    目录简介一、图像平移1.图像平移代码 (不改变图像大小)2.图像平移代码 (改变图像大小)二、图像旋转1.图像旋转函数2.仿射变换函数3.代码三、图像缩放1.图像缩放函数2.图像缩小...
    99+
    2022-11-13
  • C语言实现BMP图像闭运算处理
    闭运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。填充比结构元素小的缺口或孔,搭接短的间断而起到连接作用。 运算:也就是先膨胀后腐蚀。 #include ...
    99+
    2022-11-12
  • C语言实现BMP图像开运算处理
    开运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。滤掉比结构元素小的突刺,切断细长搭接而起到分离作用。 运算:用B开启A就是选出了A中某些与B相匹配的点,这些...
    99+
    2022-11-12
  • C语言实现BMP图像处理(彩色图转灰度图)
    我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量。所以处理很简单,根据 R、G、B 的值求出 Y 值后,将 R、G、B 值都赋值成 Y,写入新图即可。 在...
    99+
    2022-11-12
  • PHP中Grafika如何实现图像属性处理
    这篇文章主要为大家展示了“PHP中Grafika如何实现图像属性处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“PHP中Grafika如何实现图像属性处理”这篇文章吧。1、图片格式化为二进制格...
    99+
    2023-06-17
  • C语言实现BMP图像处理(直方图均衡化)
    本文实例为大家分享了C语言实现BMP图像直方图均衡化处理的具体代码,供大家参考,具体内容如下 计算步骤: 1)统计各灰度值的概率; 2)计算了累积概率直方图(CDF); 3)取整扩展...
    99+
    2022-11-12
  • C++ opencv图像处理实现图片边缘检测示例
    目录边缘检测简介一、边缘检测步骤二、Canny1.函数2.代码二、Sobel1.函数2.代码三、Scharr1.函数2.代码四、Laplacian1.函数2.代码总结边缘检测简介 边...
    99+
    2022-11-13
  • matlab如何实现图像去噪处理
    这篇文章主要介绍了matlab如何实现图像去噪处理的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇matlab如何实现图像去噪处理文章都会有所收获,下面我们一起来看看吧。1 内容...
    99+
    2022-10-19
  • C#开发中如何处理图像处理和视频处理问题
    C#开发中如何处理图像处理和视频处理问题,需要具体代码示例摘要:图像处理和视频处理在计算机视觉和媒体领域中占据重要的位置。本文将介绍如何使用C#编程语言处理图像和视频相关的问题,并提供了具体的代码示例。在图像处理方面,我们将讨论如何读取、修...
    99+
    2023-10-22
    图像处理 视频处理 C#开发
  • C语言实现BMP图像边缘检测处理
    本文实例为大家分享了C语言实现BMP图像边缘检测处理的具体代码,供大家参考,具体内容如下 以Sobel算子为例,其余模板算子卷积代码部分同Sobel算子。如:高斯算子、拉普拉斯算子等...
    99+
    2022-11-12
  • C++ opencv图像处理实现灰度变换示例
    目录灰度变换概念灰度变换的作用灰度变换的方法灰度化灰度的概念对彩色图进行灰度化1.加权平均值法2.取最大值3.平均值灰度的线性变换1.线性变换2.分段线性变换灰度的非线性变换1.对数...
    99+
    2022-11-13
  • 基于OpenCv与JVM实现加载保存图像功能(JAVA 图像处理)
    目录加载图片保存图片加载图片 openCv有一个名imread的简单函数,用于从文件中读取图像 imread 函数位于Imgcodecs类的同名包中。 加载图片代码 import ...
    99+
    2022-11-12
  • matlab如何实现形态学图像处理
    这篇文章主要介绍“matlab如何实现形态学图像处理”,在日常操作中,相信很多人在matlab如何实现形态学图像处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”matlab如何实现形态学图像处理”的疑惑有所...
    99+
    2023-07-05
  • C#开发中如何处理图像处理和图形界面设计问题
    C#开发中如何处理图像处理和图形界面设计问题,需要具体代码示例引言:在现代软件开发中,图像处理和图形界面设计是常见的需求。而C#作为一种通用的高级编程语言,具有强大的图像处理和图形界面设计能力。本文将以C#为基础,讨论如何处理图像处理和图形...
    99+
    2023-10-22
    图像处理 界面设计 C#开发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作