2016-10-20 78 views
3

我嘗試了不同的解決方案(例如this one),但顏色我回來看起來比真實圖像中的有點不同。我想這是因爲圖像只是RGB,不RGBA。可能是一個問題?斯威夫特3:獲取像素的顏色在UIImage的(更好:UIImageView的)

相關問題:如果UIImage有contentMode = .scaleAspectFill,我必須重新計算圖像還是隻能使用imageView.image

編輯:

我用這個擴展的嘗試:

extension CALayer { 
    func getPixelColor(point: CGPoint) -> CGColor { 
     var pixel: [CUnsignedChar] = [0, 0, 0, 0] 

     let colorSpace = CGColorSpaceCreateDeviceRGB() 
     let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) 

     let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue) 

     context!.translateBy(x: -point.x, y: -point.y) 

     self.render(in: context!) 

     let red: CGFloat = CGFloat(pixel[0])/255.0 
     let green: CGFloat = CGFloat(pixel[1])/255.0 
     let blue: CGFloat = CGFloat(pixel[2])/255.0 
     let alpha: CGFloat = CGFloat(pixel[3])/255.0 


     let color = UIColor(red:red, green: green, blue:blue, alpha:alpha) 

     return color.cgColor 
    } 
} 

但對某些圖像就好像座標系轉了一圈,其他的我變得很錯誤的價值觀......我是什麼我錯過了嗎?

編輯2:

我嘗試用這些圖片:

https://dl.dropboxusercontent.com/u/119600/gradient.png https://dl.dropboxusercontent.com/u/119600/[email protected]

,但我得到錯誤的價值觀。它們嵌入在UIImageView但我轉換座標:

private func convertScreenPointToImage(point: CGPoint) -> CGPoint { 
    let widthMultiplier = gradientImage.size.width/UIScreen.main.bounds.width 
    let heightMultiplier = gradientImage.size.height/UIScreen.main.bounds.height 

    return CGPoint(x: point.x * widthMultiplier, y: point.y * heightMultiplier) 
} 

這一個

enter image description here

在iPhone模擬器7,這是不正確運行的時候給我=== Optional((51, 76, 184, 255)) ...

回答

3

我寫了這是一個遊樂場。 I指數與指針圖像數據和搶RGBA值:

func pixel(in image: UIImage, at point: CGPoint) -> (UInt8, UInt8, UInt8, UInt8)? { 
    let width = Int(image.size.width) 
    let height = Int(image.size.height) 
    let x = Int(point.x) 
    let y = Int(point.y) 
    guard x < width && y < height else { 
     return nil 
    } 
    guard let cfData:CFData = image.cgImage?.dataProvider?.data, let pointer = CFDataGetBytePtr(cfData) else { 
     return nil 
    } 
    let bytesPerPixel = 4 
    let offset = (x + y * width) * bytesPerPixel 
    return (pointer[offset], pointer[offset + 1], pointer[offset + 2], pointer[offset + 3]) 
} 

let image = UIImage(named: "t.png")! 
if let (r,g,b,a) = pixel(in: image, at: CGPoint(x: 1, y:2)) { 
    print ("Red: \(r), Green: \(g), Blue: \(b), Alpha: \(a)") 
} 

請注意,如果您使用此上一個UIImage是一個UIImageView的財產像素座標是在其原有的實際圖像分辨率,而不是縮放的UIImageView的屏幕座標。此外,它嘗試使用RGB Jpg和RGBA PNG,並且兩者都可以導入爲32位RGBA圖像,因此適用於兩者。

+0

我不能讓它正常工作,我仍然得到錯誤的價值:(請參閱我的編輯 – swalkner

+0

代碼是正確的,我剛剛檢查了您的第一張圖片,我打開Photoshop,切換到吸管工具,並打開。該信息的調色板我懸停在x = 120的像素中,Y = 500和Photoshop說R:175 G:146b的232我運行在遊樂場的代碼和我得到紅175,綠:146,藍:232,阿爾法:255.什麼是你的輸入和你有什麼預期產出 –

+0

我得到不同的值(見我的編輯) - 你如何加載圖像 – swalkner