2016-12-11 5 views
0

私はUIImageには4種類のピクセルしかありません。UIイメージを文字列配列に変更する

static let black = RGBA32(red: 0, green: 0, blue: 0, alpha: 255) 
static let red = RGBA32(red: 255, green: 0, blue: 0, alpha: 255) 
static let green = RGBA32(red: 0, green: 255, blue: 0, alpha: 255) 
static let blue = RGBA32(red: 0, green: 0, blue: 255, alpha: 255) 

(画像https://stackoverflow.com/a/40207142/7010252を作成するために使用されるコードを参照)

私はその後、私は再び私のアプリで画像を開き、携帯電話のフォトライブラリに画像を保存しました。私はピクセルの数が同じであることを知っています。

どのようにしてすべてのピクセルのRGBAデータを取得できますか?

答えて

1

ここで最初に行うことは、画像をループして、その中のすべての点のマップを作成することです。

func getPixelColor(image: UIImage) { 
    let width = image.size.width 
    let height = image.size.height 

    for x in 0..<Int(width) { 
     for y in 0..<Int(height) { 
      let color = image.pixelColor(CGPoint(x: CGFloat(x), y: CGFloat(y))) 
      print(color.RGBA) 
     } 
    } 
} 

それはそれは望んでいる色を持っていたら、それはあなたがしたい文字列を提供するために、UIColor延長でRGBA関数を呼び出します。

次に、UIImageの拡張子を使用して上記の機能によって提供されたポイントを取得し、画像データにUIColorデータを照会します。

extension UIImage { 
    func pixelColor(_ point: CGPoint) -> UIColor { 
     let pixelData = cgImage?.dataProvider?.data 
     let pointerData: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

     let pixelInfo = Int(((self.size.width * point.y) + point.x)) * 4 

     let maxValue: CGFloat = 255.0 
     let compare: CGFloat = 0.99 

     let r: CGFloat = (CGFloat(pointerData[pixelInfo])/maxValue) > compare ? 1.0 : 0.0 
     let g: CGFloat = (CGFloat(pointerData[pixelInfo + 1])/maxValue) > compare ? 1.0 : 0.0 
     let b: CGFloat = (CGFloat(pointerData[pixelInfo + 2])/maxValue) > compare ? 1.0 : 0.0 
     let a = CGFloat(pointerData[pixelInfo + 3])/maxValue 

     return UIColor(red: r, green: g, blue: b, alpha: a) 
    } 
} 

この拡張は、各画素のRGB値を決定するために、生データを使用します。次に、CGFloatsでその特定の色の値が255.0であるかどうかを確認するために粗いチェックを実行します。値が1.0の場合は1.0を返し、それ以外の場合は0.0を返します。

次に、探している書式設定された文字列を提供するUIColorの拡張機能があります。

extension UIColor { 
    var RGBA: String { 
     guard let components = cgColor.components, components.count == 4 else { 
      return "" 
     } 

     return "\(components[0])-\(components[1])-\(components[2])-\(components[3])" 
    } 
} 

これは、1-0-0-1タイプの値を提供します。必要な追加情報を含めるようにこれを変更することもできます。

+0

私はそのコードを使用するときに問題があります。 私は(rgba) 1-0-0-1(赤)/ 0-1-0-1(緑)/ 0-0-1-1(青)/ 0-0-0-1のいずれかを取得する必要があります(黒) しかし、私は次のような二倍になります。(rgba)0.6787878 - 0.823345 - 0.34522 - 1 –

+0

あなたの問題に対処するように更新されました。うまくいけば、それはそれを解決する。 – CodeBender

+0

はうまく動かなかった、私はいつも "0.0-0.0-0.0-1.0"を得る。これは、ピクセルが黒であることを意味しますが、実際には画像は黒ではありません。どのように私はそれを修正する必要がある任意のアイデアをお持ちですか? @CodeBender –

関連する問題