在Swift 3中使用CGPoint从图像中获取像素颜色 [英] Getting Pixel Color from an Image using CGPoint in Swift 3
问题描述
我在Swift 3中尝试这个PixelExtractor类,得到一个错误;
无法使用类型'(UnsafeMutableRawPointer?)'的参数列表调用类型'UnsafePointer'的初始值设定项。
I am try this PixelExtractor class in Swift 3, get a error; Cannot invoke initializer for type 'UnsafePointer' with an argument list of type '(UnsafeMutableRawPointer?)'
class PixelExtractor: NSObject {
let image: CGImage
let context: CGContextRef?
var width: Int {
get {
return CGImageGetWidth(image)
}
}
var height: Int {
get {
return CGImageGetHeight(image)
}
}
init(img: CGImage) {
image = img
context = PixelExtractor.createBitmapContext(img)
}
class func createBitmapContext(img: CGImage) -> CGContextRef {
// Get image width, height
let pixelsWide = CGImageGetWidth(img)
let pixelsHigh = CGImageGetHeight(img)
let bitmapBytesPerRow = pixelsWide * 4
let bitmapByteCount = bitmapBytesPerRow * Int(pixelsHigh)
// Use the generic RGB color space.
let colorSpace = CGColorSpaceCreateDeviceRGB()
// Allocate memory for image data. This is the destination in memory
// where any drawing to the bitmap context will be rendered.
let bitmapData = malloc(bitmapByteCount)
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.PremultipliedFirst.rawValue)
let size = CGSizeMake(CGFloat(pixelsWide), CGFloat(pixelsHigh))
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
// create bitmap
let context = CGBitmapContextCreate(bitmapData, pixelsWide, pixelsHigh, 8,
bitmapBytesPerRow, colorSpace, bitmapInfo.rawValue)
// draw the image onto the context
let rect = CGRect(x: 0, y: 0, width: pixelsWide, height: pixelsHigh)
CGContextDrawImage(context, rect, img)
return context!
}
func colorAt(x x: Int, y: Int)->UIColor {
assert(0<=x && x<width)
assert(0<=y && y<height)
let uncastedData = CGBitmapContextGetData(context)
let data = UnsafePointer<UInt8>(uncastedData)
let offset = 4 * (y * width + x)
let alpha: UInt8 = data[offset]
let red: UInt8 = data[offset+1]
let green: UInt8 = data[offset+2]
let blue: UInt8 = data[offset+3]
let color = UIColor(red: CGFloat(red)/255.0, green: CGFloat(green)/255.0, blue: CGFloat(blue)/255.0, alpha: CGFloat(alpha)/255.0)
return color
}
}
修复此错误。
let data = UnsafePointer<UInt8>(uncastedData)
- >
let data = UnsafeRawPointer(uncastedData)
获取其他错误; '类型'UnsafeRawPointer?'没有下标成员'
Get other error; 'Type 'UnsafeRawPointer?' has no subscript members'
如何修改此错误?
推荐答案
当你的数据
中有 UnsafeRawPointer
时,你可以这样写:
You can write something like this when you have an UnsafeRawPointer
in your data
:
let alpha = data.load(fromByteOffset: offset, as: UInt8.self)
let red = data.load(fromByteOffset: offset+1, as: UInt8.self)
let green = data.load(fromByteOffset: offset+2, as: UInt8.self)
let blue = data.load(fromByteOffset: offset+3, as: UInt8.self)
否则,你可以得到 UnsafeMutablePointer< ;来自
(假设它是 uncastedData
的UInt8> UnsafeMutableRawPointer
):
Or else, you can get UnsafeMutablePointer<UInt8>
from your uncastedData
(assuming it's an UnsafeMutableRawPointer
):
let data = uncastedData.assumingMemoryBound(to: UInt8.self)
这篇关于在Swift 3中使用CGPoint从图像中获取像素颜色的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!