zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    iOS
    ajax 几种提交方式
  • 原文地址:https://www.cnblogs.com/mq0036/p/10463298.html
Copyright © 2011-2022 走看看