早教吧作业答案频道 -->其他-->
c#图像处理已经知道像素数据,想生成一幅图片存到本地计算机,有没有高效的方法??(除了使用双重for循环setPixel)
题目详情
c#图像处理已经知道像素数据,想生成一幅图片存到本地计算机,有没有高效的方法?? (除了使用双重for循环setPixel)
▼优质解答
答案和解析
由于C#托管代码中不能使用指针(后来经过我的验证,即使是在unsafe代码中用指针操作,速度仍然很慢),因此我们就不能像C++里面一样直接利用指针在内存中完成读写操作。好在.NETFramework提供了托管内存与非托管内存之间的读写功能,一个强大的Marshal类,使得我们快速读写图像的像素信息成为可能。 在.NETFramework2.0中,Bitmap类多了两个有关内存操作的新方法:LockBits与UnlockBits,其具体含义请参见MSDN,我在这里就直接给出利用它们以及Marshal类进行内存读写的代码。上面的GetRGB方法经过改进之后: publicstaticboolGetRGB(BitmapSource,outint[,]R,outint[,]G,outint[,]B) { try { intiWidth=Source.Width; intiHeight=Source.Height; Rectanglerect=newRectangle(0,0,iWidth,iHeight); System.Drawing.Imaging.BitmapDatabmpData=Source.LockBits(rect,System.Drawing.Imaging.ImageLockMode.ReadWrite,Source.PixelFormat); IntPtriPtr=bmpData.Scan0; intiBytes=iWidth*iHeight*3; byte[]PixelValues=newbyte[iBytes]; System.Runtime.InteropServices.Marshal.Copy(iPtr,PixelValues,0,iBytes); Source.UnlockBits(bmpData); //注意这个地方图像的两维方向与数组两维的方向是转置的关系 R=newint[iHeight,iWidth]; G=newint[iHeight,iWidth]; B=newint[iHeight,iWidth]; intiPoint=0; for(inti=0;i
看了c#图像处理已经知道像素数据,...的网友还看了以下:
一个关于电功率概念的题电风扇做的功一个是变成机械能,一个变成内能,这两个能的功率怎么计算?总功率P 2020-05-12 …
1、数组a中包含10个整数,试将其倒置。提示:(1)若只定义一个指针p,则与p+i对应的元素是P+ 2020-05-13 …
C语言中数组元素的指针表示的问题设有以下语句,其中不是对a组数元素的正确引用的是(),其中0≦i< 2020-05-14 …
下列各项中,代表复利终值系数的是( )。A.(F/P,i,n-1)B.[(P/A,i,n+1)+I] 2020-05-30 …
年利率应用题1.某银行计算客户的总存款和利息的方法如下:总存款(A)=存款(P)+利息(I),即A 2020-06-17 …
P=A(1+i)^-1+A(1+i)^-2+A(i+i)^-3+……A(1+i)^-n(1)将两边 2020-07-25 …
Matlab中直方图均衡化问题!看到书上直方图均衡化定义是:第k个像素值变换为小于等于该值的所有像 2020-07-29 …
求助:matlab中find函数的用法在直方图规范化的matlab实现中有这么一段程序,请问是怎么 2020-07-29 …
关于基础指针好心人,帮我看看这道题啊!谢谢了,怎么错了呢?#include<stdio.h>void 2020-11-04 …
(2011•莆田模拟)一个盒子装有标号为1,2,3,4,5,6且质地相同的标签各若干张,从中任取1张 2020-11-12 …