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

posted on   jack_Meng  阅读(6758)  评论(1编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2018-03-02 R学习笔记 ---- 系列文章
2018-03-02 平方根的原理
2018-03-02 python和C语言互相调用的几种方式
2018-03-02 智能家居系统结构标准化
2018-03-02 每天5分钟玩转容器技术 ---- 系列文章
2017-03-02 C#关闭子窗口而不释放子窗口对象的问题解决
2015-03-02 如何带队伍?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩