c#实现RGB字节数组生成图片
我是要用c#来实现,现在已经知道了rgb数组,那么如何快速生成一张图片呢?
其实这个话题并不局限于是rgb字节数组的顺序,只要你能对于上表示红、绿、蓝的值,就可以生成图片。知道了原理,做什么都简单了。
rgb分别只是代表一个颜色的值,如果你真是rgb,那你就是要按位置用setpiex一个个画颜色。如下:
Bitmap bmp = new Bitmap(w,h); for(int x = 0;x < w;x++){ for(int y = 0;y < h;y++){ bmp.SetPixel(x,y,Color.FromArgb(255,r,g,b)); } }
这个是最简单的了 前提是你能正确定位你的rgb的坐标,效率一点的 用 Bitmap.LookBit 来锁定内存操作。
下面再给两个RGB 和 Bitmap 互转的函数,仅供参考:
public Bitmap BGR24ToBitmap(byte[] imgBGR) { int p = 0; Bitmap bmp = new Bitmap(vW, vH, System.Drawing.Imaging.PixelFormat.Format24bppRgb); if (imgBGR != null) { //构造一个位图数组进行数据存储 byte[] rgbvalues = new byte[imgBGR.Length]; //对每一个像素的颜色进行转化 for (int i = 0; i < rgbvalues.Length; i += 3) { rgbvalues[i] = _imgData[i + 2]; rgbvalues[i + 1] = _imgData[i + 1]; rgbvalues[i + 2] = _imgData[i]; } //位图矩形 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); //得到图形在内存中的首地址 IntPtr ptr = bmpdata.Scan0; //将被锁定的位图数据复制到该数组内 //System.Runtime.InteropServices.Marshal.Copy(ptr, rgbvalues, 0, imgBGR.Length); //把处理后的图像数组复制回图像 System.Runtime.InteropServices.Marshal.Copy(rgbvalues, 0, ptr, imgBGR.Length); //解锁位图像素 bmp.UnlockBits(bmpdata); } return bmp; } public byte[] bitmap2BGR24(Bitmap img) { byte[] bgrBytes = new byte[0]; Bitmap bmp = (Bitmap)img; if (bmp != null) { //位图矩形 Rectangle rect = new Rectangle(0, 0, 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 * 3; byte[] rgbVal = new byte[bLength]; bgrBytes = new byte[bLength]; //得到图形在内存中的首地址 IntPtr ptr = bmpdata.Scan0; //将被锁定的位图数据复制到该数组内 System.Runtime.InteropServices.Marshal.Copy(bmpdata.Scan0, rgbVal, 0, bLength); //把处理后的图像数组复制回图像 //System.Runtime.InteropServices.Marshal.Copy(rgbVal, 0, ptr, bytes); //解锁位图像素 bmp.UnlockBits(bmpdata); //对每一个像素的rgb to bgr的转换 for (int i = 0; i < rgbVal.Length; i += 3) { bgrBytes[i] = rgbVal[i + 2]; bgrBytes[i + 1] = rgbVal[i + 1]; bgrBytes[i + 2] = rgbVal[i]; } } return bgrBytes; }
参考:https://bbs.csdn.net/topics/391862868
关注我】。(●'◡'●)
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的【因为,我的写作热情也离不开您的肯定与支持,感谢您的阅读,我是【Jack_孟】!
本文来自博客园,作者:jack_Meng,转载请注明原文链接:https://www.cnblogs.com/mq0036/p/10463298.html
【免责声明】本文来自源于网络,如涉及版权或侵权问题,请及时联系我们,我们将第一时间删除或更改!
posted on 2019-03-02 22:17 jack_Meng 阅读(6706) 评论(1) 编辑 收藏 举报