Cảm ơn bạn đã trả lời câu hỏi trên. Nếu cần sử dụng calloc(), hãy xem:
let imageData = calloc(width * height, MemoryLayout<UInt32>.size).assumingMemoryBound(to: UInt32.self)
Điều tôi thấy là tôi cần sử dụng "calloc" trong ứng dụng đồ họa để tải bitmap. Những gì tôi thấy là nếu malloc hoặc Swift phân bổ (dung lượng :) đã được sử dụng, rằng việc phân bổ có rác ngẫu nhiên (như người ta có thể mong đợi). Nếu điều này đã được sử dụng như là điểm khởi đầu để có được một bitmap của một hình ảnh, bạn sẽ thấy rác ngẫu nhiên trong mô phỏng nếu nền của hình ảnh rõ ràng. Thiết bị thực có vẻ rõ ràng điều này khi vẽ hình ảnh, và trình mô phỏng xử lý nền tảng rõ ràng như là một no-op. Sau đó, bạn có thể làm cho tiện ích mở rộng UIImage sau để nhận bitmap (Swift 3.0):
extension UIImage {
func unSafeBitmapData() -> UnsafeMutablePointer<UInt32>? {
guard let cgImage = self.cgImage else { return nil }
let width = Int(self.size.width)
let height = Int(self.size.height)
let bitsPerComponent = 8
let bytesPerPixel = 4
let bytesPerRow = width * bytesPerPixel
let maxPix = width * height
let imageData = calloc(maxPix, MemoryLayout<UInt32>.size).assumingMemoryBound(to: UInt32.self)
let colorSpace = CGColorSpaceCreateDeviceRGB()
var bitmapInfo: UInt32 = CGBitmapInfo.byteOrder32Big.rawValue
bitmapInfo |= CGImageAlphaInfo.premultipliedLast.rawValue & CGBitmapInfo.alphaInfoMask.rawValue
guard let imageContext = CGContext(data: imageData, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo) else { return nil }
imageContext.draw(cgImage, in: CGRect(origin: CGPoint.zero, size: self.size))
return imageData
}
}
Con trỏ thô của bạn ở đâu? Có vẻ như bạn phải khởi tạo một 'UnsafeMutablePointer' của một kích thước nhất định –
Lỗi của tôi, 'UInt8', không phải' UInt32' –