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

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条回答 默认 最新

  • 急速光粒 2021-11-22 11:59
    关注

    感觉你对图像的多波段位的理解有一些问题,其实只要处理rgb就好了,你现在的逻辑又复杂且效率很低,灰度的话效率应该很高的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    1人已打赏
查看更多回答(6条)

报告相同问题?

问题事件

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

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效