ucgitxsfiqucgitxsfiq 2021-11-22 07:25 采纳率: 100%
浏览 466
已结题

C#图像点阵处理性能问题

我这有个方法要将图像转成指定格式的数组,只取黑白,目前转是可以转,但是效率非常慢,很吃CPU,想请大拿帮我看看,有没有什么可以高效转换的方法,12K的图片,转换要300毫秒,想控制在50毫秒内。
public byte[] GetGrayByte(Bitmap srcBmp)
{
DateTime dt = DateTime.Now;
int iHeight = srcBmp.Height;
int iWidth = srcBmp.Width;

        int num = srcBmp.Height / 8;
        if (srcBmp.Height % 8 > 0)
        {
            num++;
        }

        string text2 = "";
        Rectangle rect = new Rectangle(0, 0, srcBmp.Width, srcBmp.Height);
        BitmapData srcBmpData = srcBmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

        byte[] grayValues = new byte[(rect.Width * rect.Height) / 8];  //定义转化为灰度后需要存储的数组

        int stride = srcBmpData.Stride;  // 扫描线的宽度,比实际图片要大
        int offset = stride - iWidth * 3;  // 显示宽度与扫描线宽度的间隙
        IntPtr ptr = srcBmpData.Scan0;   // 获取bmpData的内存起始位置的指针
        int scanBytesLength = stride * iHeight;  // 用stride宽度,表示这是内存区域的大小

        byte[] rgbValues = new byte[scanBytesLength];  // 为目标数组分配内存
        Marshal.Copy(ptr, rgbValues, 0, scanBytesLength);  // 将图像数据拷贝到rgbValues中

        byte blue, green, red, YUI;

        int iLenght = 0;
        for (int i = 0; i < iWidth; i++)
        {
            for (int j = 0; j < num; j++)
            {
                text2 = "";
                for (int k = 0; k < 8; k++)
                {
                    int num2 = k + j * 8;
                    if (num2 >= iHeight)
                    {
                        text2 += "1";
                        continue;
                    }
                    int iPosition = num2 * stride + i * 3;
                    //blue = rgbValues[iPosition];
                    //green = rgbValues[iPosition + 1];
                    red = rgbValues[iPosition + 2];
                    text2 = red == 0 ? (text2 + "0") : (text2 + "1");
                    //YUI = (byte)(0.229 * red + 0.587 * green + 0.144 * blue);
                    //text2 = YUI > 127 ? (text2 + "1") : (text2 + "0");
                }
                grayValues[iLenght] = Convert.ToByte(text2, 2);
                iLenght++;
            }
        }

        //解锁位图
        srcBmp.UnlockBits(srcBmpData);  //读取完元信息,这里就不用了,一定要记得解锁,否则会报错
        srcBmp.Dispose();
        dTemplateCodingTime = (DateTime.Now - dt).TotalMilliseconds;
        return grayValues;
    }
  • 写回答

7条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

      • 系统已结题 12月7日
      • 已采纳回答 11月29日
      • 创建了问题 11月22日

      悬赏问题

      • ¥30 Dijkstra‘s 最短路径
      • ¥15 在线教育培训平台,主要以点播视频和在线练习测试为主,除将视频做切片外,有其他哪种方式降低流量?(关键词-带宽速率)
      • ¥20 用c语音或c++实现银行叫号系统
      • ¥15 人工智能 规则正向演绎和推理
      • ¥20 基于STM32F401的电子密码锁设计
      • ¥15 famamacbeth回归中遇到only size-1 arrays can be converted to Python scalars,求解答
      • ¥15 单片机多个自锁按键的编程实践
      • ¥15 用python操作redis存储中文后,再取出的数据变成了乱码怎么办?
      • ¥15 C语言简单排序问题有偿求解
      • ¥20 请问图片的代码什么意思