繁体   English   中英

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;
            }
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM