我是要用c#来实现,现在已经知道了rgb数组,那么如何快速生成一张图片呢?

其实这个话题并不局限于是rgb字节数组的顺序,只要你能对于上表示红、绿、蓝的值,就可以生成图片。知道了原理,做什么都简单了。

rgb分别只是代表一个颜色的值,如果你真是rgb,那你就是要按位置用setpiex一个个画颜色。如下:

Bitmap bmp = new Bitmap(w,h);
for(int x = ;x < w;x++){
for(int y = ;y < h;y++){
bmp.SetPixel(x,y,Color.FromArgb(,r,g,b));
}
}

这个是最简单的了 前提是你能正确定位你的rgb的坐标,效率一点的 用 Bitmap.LookBit 来锁定内存操作。

下面再给两个RGB 和 Bitmap 互转的函数,仅供参考:

public Bitmap BGR24ToBitmap(byte[] imgBGR)
{ int p = ;
Bitmap bmp = new Bitmap(vW, vH, System.Drawing.Imaging.PixelFormat.Format24bppRgb); if (imgBGR != null)
{
//构造一个位图数组进行数据存储
byte[] rgbvalues = new byte[imgBGR.Length]; //对每一个像素的颜色进行转化
for (int i = ; i < rgbvalues.Length; i += )
{
rgbvalues[i] = _imgData[i + ];
rgbvalues[i + ] = _imgData[i + ];
rgbvalues[i + ] = _imgData[i];
} //位图矩形
Rectangle rect = new Rectangle(, , bmp.Width, bmp.Height);
//以可读写的方式将图像数据锁定
System.Drawing.Imaging.BitmapData bmpdata = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat);
//得到图形在内存中的首地址
IntPtr ptr = bmpdata.Scan0; //将被锁定的位图数据复制到该数组内
//System.Runtime.InteropServices.Marshal.Copy(ptr, rgbvalues, 0, imgBGR.Length);
//把处理后的图像数组复制回图像
System.Runtime.InteropServices.Marshal.Copy(rgbvalues, , ptr, imgBGR.Length);
//解锁位图像素
bmp.UnlockBits(bmpdata); }
return bmp;
} public byte[] bitmap2BGR24(Bitmap img)
{
byte[] bgrBytes = new byte[];
Bitmap bmp = (Bitmap)img; if (bmp != null)
{
//位图矩形
Rectangle rect = new Rectangle(, , bmp.Width, bmp.Height);
//以可读写的方式将图像数据锁定
System.Drawing.Imaging.BitmapData bmpdata = bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat); //构造一个位图数组进行数据存储
int bLength = bmp.Width * bmp.Height * ;
byte[] rgbVal = new byte[bLength];
bgrBytes = new byte[bLength];
//得到图形在内存中的首地址
IntPtr ptr = bmpdata.Scan0;
//将被锁定的位图数据复制到该数组内
System.Runtime.InteropServices.Marshal.Copy(bmpdata.Scan0, rgbVal, , bLength);
//把处理后的图像数组复制回图像
//System.Runtime.InteropServices.Marshal.Copy(rgbVal, 0, ptr, bytes);
//解锁位图像素
bmp.UnlockBits(bmpdata); //对每一个像素的rgb to bgr的转换
for (int i = ; i < rgbVal.Length; i += )
{
bgrBytes[i] = rgbVal[i + ];
bgrBytes[i + ] = rgbVal[i + ];
bgrBytes[i + ] = rgbVal[i];
} }
return bgrBytes;
}

参考:https://bbs.csdn.net/topics/391862868

c#实现RGB字节数组生成图片的更多相关文章

  1. 将图片文件转化为字节数组字符串,并对其进行Base64编码处理,以及对字节数组字符串进行Base64解码并生成图片

    实际开发中涉及图片上传并且量比较大的时候一般处理方式有三种 1.直接保存到项目中 最老土直接方法,也是最不适用的方法,量大对后期部署很不方便 2.直接保存到指定路径的服务器上.需要时候在获取,这种方式 ...

  2. 【java工具类】对字节数组字符串进行Base64解码并生成图片

    import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import org.springfra ...

  3. Java将文件转为字节数组

    Java将文件转为字节数组 关键字:文件,文件流,字节流,字节数组,二进制 摘要:最近工作中碰到的需求是,利用http传输二进制数据到服务器对应接口,需要传输userId, file(加密后)等一系列 ...

  4. (IEEE-754) 字节数组与浮点数之间的互相转换(MODBUS float类型)

    在做上位机开发过程中,经常会碰到字节数组与浮点数,整数等数据之间的转换,有时为了验证数据是否解析正确,得借助于IEEE浮点数工具,本文把基于c#实现的浮点数与字节数组(或16进制的字符串)转换的实现方 ...

  5. C#字节数组转换成字符串

    C#字节数组转换成字符串 如果还想从 System.String 类中找到方法进行字符串和字节数组之间的转换,恐怕你会失望了.为了进行这样的转换,我们不得不借助另一个类:System.Text.Enc ...

  6. 【.net】从比较两个字节数组谈起

    上午,有位初学者朋友问:如何比较两个字节数组中各字节是否相等? 不许笑,我一向反对嘲笑初学者,初学者不认真学习时你可以批评,但不能讥嘲.你不妨想想,你自己开始学习编程的时候又是什么个光景? 好,于是, ...

  7. 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转

    包名称:org.apache.commons.codec.binary 类名称:org.apache.commons.codec.binary.Hex 1.字节数组(byte[])转为十六进制(Hex ...

  8. java 字节数组转int

    4字节数组转int类型 小端模式 /** * 数组转int类型 * * @param src * @return */ public static int bytesToInt(byte[] src) ...

  9. java 读取文件的字节数组

    /*文件64位编码*/ public static void main(String[] args) {    byte[] fileByte = toByteArray(newFile);   St ...

随机推荐

  1. Cracking The Coding Interview5.2

    //Given a (decimal - e.g. 3.72) number that is passed in as a string, print the binary representatio ...

  2. C++四种类型之间的转换

    C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a. C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cas ...

  3. 四则运算 来源:一位热心的网友 http://www.tqcto.com/article/software/336297.html

    功能:实现真分数的四则运算 语言:Java  平台:JDK下的eclipse github地址:https://github.com/yeershao/hello-world/commit/9920a ...

  4. Effective Java Methods Common to All Objects

    Obey the general contract when overriding equals 先了解equals 和 == 的区别,如果不重写equals, equals比较的仅仅只是是否引用同一 ...

  5. QueryString中的加号变成空格解决方法

    通过Request.QueryString["CheckItem"]的方式调用值的时候,数值中的加号“+”会转换为空格“ ” 例如传输“ABC+EFG”,就会取到“ABC EFG” ...

  6. 路径问题 :<c:url >的作用

    最近的项目一直报这样的错 可是本地启动 又没问题,xshell查看日志 没有错误日志,找了好久都没想到错误原因.一位大佬几分钟就找到原因了有点扎心. 首先说一下解决问题的思路.首先报错是4开头,说明是 ...

  7. Server SSL certificate verification failed: certificate has expired, issuer is not trusted

    Unable to connect to a repository at URL 'https://xxxxx/svn/include' Server SSL certificate verifica ...

  8. java关键字详解----static

    Java Static关键字详解   提起static关键字,相信大家绝对不会陌生,但是,想要完全说明白,猛的一想,发现自己好像又说不太明白... ...比方说,昨天被一个同学问起的时候... ... ...

  9. 导出文件为excle

    handleOutPut() { const searchData=this.state.searchData; let url = commonData.baseMerchantUrl + &quo ...

  10. 为何linux(包括mac系统)执行指令要加上 ./ ??

    比如,现在要在$HIVE_HOME/bin下执行hive指令来启动hive,则该指令的执行顺序如下所示: 1 先找PATH路径 1.1 如果PATH路径下配置了$HIVE_HOME/bin,无论PAT ...