2016-07-28 22 views
1

Ich bin ein Neuling in der IOS-Entwicklung. Ich habe bereits versucht mit dem folgenden Code für einzigartige Farben von einem UIImage, aber es funktioniert nicht. Und meine Bildgröße ist 360x480.Finden Sie die einzigartigen Farben von einem UIImage in 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)) 
    } 

mit diesem Code ich nur immer zwei Farben von jedem Bild, hilf mir, anstatt alle die einzigartigen Farben, so freundlich auf, wie dieses Problem zu lösen.

Ich habe den gleichen Code mit C++ versucht, und es funktioniert gut.

Vielen Dank im Voraus Sharief

Antwort

0

UIColor auf Komponentenwerte von 0 basiert .. < 1.0, nicht 0 .. < 256. Teilen Sie jede Komponente von 255,0 und Sie sollten bessere Ergebnisse erzielen. Beachten Sie auch, dass Ihr Hashalgorithmus rot komplett (0xff & 0xe0 << 2) = 0 eliminiert, da diese Mathematik als UInt8 ausgeführt wird.

+0

Nur ein Hinweis: In Apps, die mit iOS 10 oder höher verknüpft sind, wird die Farbe in einem erweiterten Farbraum angegeben, und der Eingabewert wird niemals geklemmt, sodass der Fließkommawert unter 0 oder über 1,0 gehen kann. Docs: https://developer.apple.com/reference/uikit/uicolor/1621925-init –

+0

Ja, aber in diesem Fall, da er von ARGB8 zu UIColor geht, sind sie immer im Bereich 0,0 .. <1,0. –