在封面下,UIGraphicsBeginImageContext
創建了一個CGBitmapContext
。您可以使用CGBitmapContextGetData
訪問上下文的像素存儲。這種方法的問題是UIGraphicsBeginImageContext
函數選擇用於存儲像素數據的字節順序和顏色空間。這些選擇(尤其是字節順序)可能會在未來版本的iOS中(甚至在不同的設備上)發生變化。
所以我們直接用CGBitmapContextCreate
創建上下文,這樣我們就可以確定字節順序和顏色空間。
在我的操場上,我添加了一張名爲[email protected]
的測試圖像。
import XCPlayground
import UIKit
let image = UIImage(named: "pic.jpeg")!
XCPCaptureValue("image", value: image)
下面是我們如何創建位圖背景下,拍攝圖像的規模考慮(你沒有在你的問題做):
let rowCount = Int(image.size.height * image.scale)
let columnCount = Int(image.size.width * image.scale)
let stride = 64 * ((columnCount * 4 + 63)/64)
let context = CGBitmapContextCreate(nil, columnCount, rowCount, 8, stride,
CGColorSpaceCreateDeviceRGB(),
CGBitmapInfo.ByteOrder32Little.rawValue |
CGImageAlphaInfo.PremultipliedLast.rawValue)
接下來,我們調整座標系匹配的內容UIGraphicsBeginImageContextWithOptions
會做,這樣我們就可以正確地和輕鬆地繪製圖像:
CGContextTranslateCTM(context, 0, CGFloat(rowCount))
CGContextScaleCTM(context, image.scale, -image.scale)
UIGraphicsPushContext(context!)
image.drawAtPoint(CGPointZero)
UIGraphicsPopContext()
注意UIImage.drawAtPoint
需要image.orientation
考慮。 CGContextDrawImage
不。
現在我們來看一個指向上下文中原始像素數據的指針。該代碼是更清楚,如果我們定義一個結構來訪問每個像素的各個部件:
struct Pixel {
var a: UInt8
var b: UInt8
var g: UInt8
var r: UInt8
}
let pixels = UnsafeMutablePointer<Pixel>(CGBitmapContextGetData(context))
注意,Pixel
成員的順序被定義爲我在bitmapInfo
參數設置爲CGBitmapContextCreate
特定比特匹配。
現在我們可以遍歷像素。注意,我們使用rowCount
和columnCount
,上面計算,訪問所有的像素,不顧形象的規模:
for y in 0 ..< rowCount {
if y % 2 == 0 {
for x in 0 ..< columnCount {
let pixel = pixels.advancedBy(y * stride/sizeof(Pixel.self) + x)
pixel.memory.r = 255
}
}
}
最後,我們從上下文的新形象:
let newImage = UIImage(CGImage: CGBitmapContextCreateImage(context)!, scale: image.scale, orientation: UIImageOrientation.Up)
XCPCaptureValue("newImage", value: newImage)
結果在我的遊樂場的時間表:
最後,請注意,如果你的圖片是大的,要通過PIX以像素爲單位可能會很慢。如果您可以找到一種方法來使用Core Image或GPUImage來執行圖像處理,它將會快得多。否則,使用Objective-C並手動向量化(使用NEON內在函數)可能會大大提升。
你試過這個:http://stackoverflow.com/questions/144250/how-to-get-the-rgb-values-for-a--pixel-on-an-image-on-the-iphone –
相關的答案看起來不錯IMO –