Xamarin.Forms C# 查找图像或图像 byte[] 数组的主色
Xamarin.Forms C# find dominant color of image or image byte[] array
我正在使用 Xamarin.Forms 开发跨平台应用程序。使用 c# 和 Xamarin 查找图像主色的最佳方法是什么?我找到了一种 ios 方法:https://github.com/mxcl/UIImageAverageColor/blob/master/UIImage%2BAverageColor.m 但似乎无法转换为等效的 c#。什么是好方法?对于我的 ios 实现,我可以使用 UIImage 或 byte[] 数组。
感谢您的帮助!
你可以试试这个(但它得到一个 Bitmap
对象,希望能有所帮助):
public static Color getDominantColor(Bitmap bmp)
{
//Used for tally
int red = 0;
int green = 0;
int blue = 0;
int acc = 0;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
Color tmpColor = bmp.GetPixel(x, y);
red += tmpColor.R;
green += tmpColor.G;
blue += tmpColor.B;
acc++;
}
}
//Calculate average
red /= acc;
green /= acc;
blue /= acc;
return Color.FromArgb(red, green, blue);
}
别忘了Using
:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
编辑:
无法为您的 Byte[]
图像表示找到确切的解决方案,但我发现了这个:
public static byte[] ImageToByteArray(Image image)
{
ImageConverter myConverter = new ImageConverter();
return (byte[])myConverter.ConvertTo(image typeof(byte[]));
}
如您所见,上面的代码从 Image
转换为 Byte[]
。
干杯!
这似乎有效。我需要 运行 一些测试来验证有多有效和多快,但如果其他人想要类似的东西:
public static UIColor averageColor(UIImage image)
{
CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB ();
byte[] rgba = new byte[4];
CGBitmapContext context = new CGBitmapContext (rgba, 1, 1, 8, 4, colorSpace, CGImageAlphaInfo.PremultipliedLast);
context.DrawImage(new RectangleF(0, 0, 1, 1), image.CGImage);
if(rgba[3] > 0) {
var alpha = ((float)rgba[3])/255.0;
var multiplier = alpha/255.0;
var color = new UIColor (
(float)(rgba [0] * multiplier),
(float)(rgba [1] * multiplier),
(float)(rgba [2] * multiplier),
(float)(alpha)
);
return color;
}
else {
var color = new UIColor (
(float)(rgba [0] / 255.0),
(float)(rgba [1] / 255.0),
(float)(rgba [2] / 255.0),
(float)(rgba [3] / 255.0)
);
return color;
}
}
我正在使用 Xamarin.Forms 开发跨平台应用程序。使用 c# 和 Xamarin 查找图像主色的最佳方法是什么?我找到了一种 ios 方法:https://github.com/mxcl/UIImageAverageColor/blob/master/UIImage%2BAverageColor.m 但似乎无法转换为等效的 c#。什么是好方法?对于我的 ios 实现,我可以使用 UIImage 或 byte[] 数组。
感谢您的帮助!
你可以试试这个(但它得到一个 Bitmap
对象,希望能有所帮助):
public static Color getDominantColor(Bitmap bmp)
{
//Used for tally
int red = 0;
int green = 0;
int blue = 0;
int acc = 0;
for (int x = 0; x < bmp.Width; x++)
{
for (int y = 0; y < bmp.Height; y++)
{
Color tmpColor = bmp.GetPixel(x, y);
red += tmpColor.R;
green += tmpColor.G;
blue += tmpColor.B;
acc++;
}
}
//Calculate average
red /= acc;
green /= acc;
blue /= acc;
return Color.FromArgb(red, green, blue);
}
别忘了Using
:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
编辑:
无法为您的 Byte[]
图像表示找到确切的解决方案,但我发现了这个:
public static byte[] ImageToByteArray(Image image)
{
ImageConverter myConverter = new ImageConverter();
return (byte[])myConverter.ConvertTo(image typeof(byte[]));
}
如您所见,上面的代码从 Image
转换为 Byte[]
。
干杯!
这似乎有效。我需要 运行 一些测试来验证有多有效和多快,但如果其他人想要类似的东西:
public static UIColor averageColor(UIImage image)
{
CGColorSpace colorSpace = CGColorSpace.CreateDeviceRGB ();
byte[] rgba = new byte[4];
CGBitmapContext context = new CGBitmapContext (rgba, 1, 1, 8, 4, colorSpace, CGImageAlphaInfo.PremultipliedLast);
context.DrawImage(new RectangleF(0, 0, 1, 1), image.CGImage);
if(rgba[3] > 0) {
var alpha = ((float)rgba[3])/255.0;
var multiplier = alpha/255.0;
var color = new UIColor (
(float)(rgba [0] * multiplier),
(float)(rgba [1] * multiplier),
(float)(rgba [2] * multiplier),
(float)(alpha)
);
return color;
}
else {
var color = new UIColor (
(float)(rgba [0] / 255.0),
(float)(rgba [1] / 255.0),
(float)(rgba [2] / 255.0),
(float)(rgba [3] / 255.0)
);
return color;
}
}