如何将颜色列表转换为argb值列表

时间:2016-01-12 23:06:56

标签: c# image-processing colors

我想将颜色列表转换为ARGB值列表(int Values)我正在使用以下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();

1 个答案:

答案 0 :(得分: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);