2016-07-28 9 views
1

私はIOS開発の初心者です。私はすでにUIImageからユニークな色を得るために次のコードを試しましたが、うまくいきません。私の画像サイズは360x480です。私は任意の画像から2色を取得しています。このコードで UIImageからユニークな色をすばやく見つけられますか?

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

、代わりにすべてのユニークな色の、とても親切にこの問題を解決する方法で私を助けて。

C++を使用して同じコードを試しましたが、うまくいきました。 Sharief

答えて

0

UIColorが0からコンポーネントの値に基づいて事前に

おかげで... < 1.0、ない0 .. < 256デバイド各部品255.0によって、あなたはより良い結果を得る必要があります。また、あなたのハッシュアルゴリズムは、赤が完全に(0xff & 0xe0 << 2) = 0を排除することに注意してください。その計算はUInt8として行われます。

+0

iOS 10以降にリンクされているアプリでは、色が拡張色空間で指定され、入力値は決して固定されないため、浮動小数点値は0以上1.0以下になる可能性があります。 Docs:https://developer.apple.com/reference/uikit/uicolor/1621925-init –

+0

この場合、彼はARGB8からUIColorに行くので、常に0.0 .. <1.0の範囲にあります。 –

関連する問題