2015-01-24 3 views
3

Я использую Xamarin.Forms для разработки кросс-платформенного приложения. Каков наилучший подход с использованием C# с Xamarin для поиска доминирующего цвета изображения? Я нашел подход ios: https://github.com/mxcl/UIImageAverageColor/blob/master/UIImage%2BAverageColor.m, но, похоже, не может конвертировать в эквивалент C#. Что такое хороший метод? Для моей реализации ios я могу использовать массив UIImage или byte [].Xamarin.Forms C# найти доминирующий цвет изображения или изображения byte [] array

Спасибо за помощь!

+0

вы знаете формат байт, или это сжатый поток, такой как JPG? –

+0

Для моей реализации iOS (я использую настраиваемый элемент управления обрезкой изображения для выбора изображения и обрезки, еще не приступил к реализации андроида), я использую UIImage, а затем: _data = image.AsPNG(); _ _data.ToArray(); _ , чтобы получить мой массив. – mjrobichaud

ответ

0

Это, кажется, работает. Мне нужно запустить несколько тестов, чтобы проверить, насколько эффективно и как быстро есть, но в случае, если кто-то хочет что-то подобное: (? РГБ, ARGB и т.д.)

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

U может попробовать это (но это получить 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; 

Edit:

Не удалось найти точное решение для вашего изображения Byte[], но я нашел это:

public static byte[] ImageToByteArray(Image image) 
{ 
    ImageConverter myConverter = new ImageConverter(); 
    return (byte[])myConverter.ConvertTo(image typeof(byte[])); 
} 

Приведенный выше код, так как вы можете видеть, конвертировать из Image в Byte[].

Cheers!

+0

Спасибо @ gran33, это выглядит очень элегантным решением, но, к сожалению, я не верю, что Xamarin.Forms поддерживает System.Drawing.Bitmap. Мне интересно, можно ли сделать что-то подобное с помощью массива byte [] изображения? – mjrobichaud

+0

@mjrobichaud Просмотреть мое редактирование .. – gran33

+0

У меня есть данные в форме byte []. Надеемся вычислить среднее значение из данных массива. – mjrobichaud

Смежные вопросы