【问题标题】:how to convert list of colors to list of argb values如何将颜色列表转换为 argb 值列表
【发布时间】:2016-04-17 18:22:56
【问题描述】:

我想将颜色列表转换为 ARGB 值列表(int 值),我正在使用以下 c# 代码:

foreach(var element in colorlist)
{
    intlist.add(element.toargb());
}

但是它需要时间还有另一种更快的方法吗? 这就是我首先将颜色添加到列表中的方式:

for (int x = 0; x < image.Size.Width; x++)
            for (int y = 0; y < image.Size.Height; y++)
            {
                Color c = image.GetPixel(x, y);
                if (histo.ContainsKey(c))
                    histo[c] = histo[c] + 1;
                else
                    histo.Add(c, 1);
            }

        var result1 = histo.OrderByDescending(a => a.Value);
        var Most_Used_Colors = result1.Select(x => x.Key).Take(color_no).ToList();

【问题讨论】:

  • 这是什么语言?在第一种情况下,您的颜色究竟是如何存储的(例如“#rrggbb”、“rgb(1,2,3)”或其他)。如果我们能看到更多代码,我们会更有帮助。
  • 对不起,我忘了说这段代码是用 c# 语言编写的 'for (int x = 0; x
  • 随意使用额外信息编辑您的原始问题,而不是试图将代码放入评论中。

标签: c# image-processing colors


【解决方案1】:

GetPixel 方法很慢。您可以使用 LockBits 方法,然后迭代图像并获取 argb 值。请注意,这要复杂得多,并且需要非托管代码权限,但速度也快得多。这段代码应该能让你走上正轨,但我不保证它完全正确地工作:

        var bitData = image.LockBits(new Rectangle(Point.Empty,image.Size), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

        int numBytes = bitData.Stride * image.Height;
        byte[] rgbValues = new byte[numBytes];

        IntPtr ptr = bitData.Scan0;
        // copy the image into an array
        Marshal.Copy(ptr, rgbValues, 0, numBytes);

        for (int i = 3; i < rgbValues.Length; i+= 4)
        {
            var c = Color.FromArgb(rgbValues[i], rgbValues[i - 1], rgbValues[i - 2], rgbValues[i - 3]);
            if (histo.ContainsKey(c))
                histo[c] = histo[c] + 1;
            else
                histo.Add(c, 1);
        }

        image.UnlockBits(bitData);

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    相关资源
    最近更新 更多