Я пишу простой инструмент, пользователь может выбрать изображение, и оно должно перечислить все цвета, найденные на картинке.
Теперь я сталкиваюсь с 2 основными проблемами, одна из которых заключается в том, что это медленнопотому что я перебираю все пиксели изображения.Во-вторых, я получаю неожиданные результаты.
Во-первых, код:
public static async Task<List<ImageColor>> GetImageColorsAsync(StorageFile image)
{
List<ImageColor> colors = new List<ImageColor>();
var imagestream = await image.OpenStreamForReadAsync(); // Convert image to stream
var imageDecoder = await BitmapDecoder.CreateAsync(imagestream.AsRandomAccessStream()); // decode stream
var imagePixelData = await imageDecoder.GetPixelDataAsync(); // get information about pixels
var bytes = imagePixelData.DetachPixelData(); // get pixel data
for (int x = 0; x < imageDecoder.PixelWidth; x++)
{
for (int y = 0; y < imageDecoder.PixelHeight; y++)
{
var location = (y * (int)imageDecoder.PixelWidth + x) * 3; // Navigate to corresponding coordinates
var color = Color.FromArgb(0, bytes[location + 0], bytes[location + 1], bytes[location + 2]); // Filter Red Green Blue and convert this to Argb
// find if color already exsists from its hex code
string hex = color.ToString();
var prevColor = colors.FirstOrDefault(a => a.ColorCodeHex == hex);
if (colors.Count == 0 || prevColor == null)
{
// new color
ImageColor imgColor = new ImageColor()
{
R = color.R,
G = color.G,
B = color.B,
ColorCodeHex = hex,
Occurence = 1
};
colors.Add(imgColor);
}
else
{
// exsisting color
prevColor.Occurence++;
}
}
}
return colors;
}
Теперь мне действительно нужно пройти через каждый пиксель?
И я протестировал эту функцию, используя черное изображение (полностью черное), и на этом рисунке я получил 4 цвета: черный, красный, зеленый и синий.
Кроме того, при тестировании с использованиемизображение, которое было просто скриншотом некоторого текста (поэтому присутствовали цвета черный, белый и, возможно, немного желтого), результат был огромным (почти 1000+ цветов), поэтому с моим методом явно что-то не так
Теперьстроки, где я нахожу location
и color
, не мои, я нашел их в Интернете, и я не могу убедиться, что именно так вы должны это сделать.
Любая помощь, ребята?