2016-07-28 2 views
1

Я новичок в разработке IOS. Я уже пытался использовать следующий код для получения уникальных цветов от UIImage, но он не работает. И мой размер изображения 360x480.Найдите уникальные цвета из UIImage в swift?

let data = CGBitmapContextGetData(context) 
    var dataType = UnsafePointer<UInt8>(data) 
    var rgb: RGB = (red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0) 

    var RedOffSet: UInt8 = 0xE0 
    var GreenOffSet: UInt8 = 0xF0 
    var BlueOffSet: UInt8 = 0xE0 


    var RGBHistogram = [Int](count: 1024, repeatedValue: 0) 
    var Top10Colors = [UInt](count: 10, repeatedValue: 0) 
    let size: Int = 4 * pixelsWide * pixelsHigh 
    var dtIndex = 0 


    while(true) 
    { 
     if(dtIndex < (size - 4)){ 

      //let alpha = dataType[0] 

      let red  = (dataType[dtIndex + 1]) & RedOffSet 
      let green = (dataType[dtIndex + 2]) & GreenOffSet 
      let blue = (dataType[dtIndex + 3]) & BlueOffSet 

      let index = red << 2 | green >> 1 | blue >> 5 
      let i: Int = Int(index) 
      RGBHistogram[i] += 1 
      //dataType += 4 
      dtIndex += 1 
     } 
     else { 

      print("Histogramm Created and Exited from Loop Here") 
      break; 
     } 
    } 

    //find the Top 10 Colors from Histogramm 
    var prevMax = 0 
    var max = 0 
    var maxJ = 0 

    for var indexI in 0 ..< 10 { 
     max = 0 
     for var indexJ in 0 ..< 1024 { 

      if indexI != 0 { 

       if (RGBHistogram[indexJ] > max) && (RGBHistogram[indexJ] < prevMax) { 
        max = RGBHistogram[indexJ] 
        maxJ = indexJ 
       } 
      } 
      else { 

       if RGBHistogram[indexJ] > max { 
        max = RGBHistogram[indexJ] 
        maxJ = indexJ 
       } 
      } 
     } 
     Top10Colors[indexI] = UInt(maxJ) 
     prevMax = RGBHistogram[maxJ] 
    } 

    //Change the Top 10 Cors to its RGB 

    for(var index = 0; index < 10; index += 1) { 

     let red  = (Top10Colors[index] >> 2) & UInt(RedOffSet) 
     let green = (Top10Colors[index] << 1) & UInt(GreenOffSet) 
     let blue = (Top10Colors[index] << 5) & UInt(BlueOffSet) 

     rgb.red = CGFloat(red) 
     rgb.green = CGFloat(green) 
     rgb.blue = CGFloat(blue) 

     cpUniqueColorsList.append(UIColor(red: rgb.red, green: rgb.green, blue: rgb.blue, alpha: 1.0)) 
    } 

с этим кодом я только получать 2 цвета из любого изображения, вместо всех уникальных цветов, так любезно помочь мне о том, как решить эту проблему.

Я пробовал тот же код с помощью C++, и он работает нормально.

Заранее спасибо Sharief

ответ

0

UIColor основывается на значениях компонентов от 0 .. < 1.0, а не 0 .. < 256. Разделить каждый компонент по 255,0 и вы должны получить лучшие результаты. Также обратите внимание, что ваш алгоритм хэширования полностью исключает красный (0xff & 0xe0 << 2) = 0, поскольку эта математика будет выполнена как UInt8.

+0

Только FYI: в приложениях, связанных с iOS 10 или более поздней версией, цвет указан в расширенном цветовом пространстве, а входное значение никогда не зажимается, поэтому значение с плавающей запятой может идти ниже 0 или выше 1.0. Документы: https://developer.apple.com/reference/uikit/uicolor/1621925-init –

+0

Да, но в этом случае, поскольку он идет от ARGB8 до UIColor, они всегда находятся в диапазоне 0.0 .. <1.0. –