我想将颜色列表转换为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();
答案 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);