2017-10-16 22 views
-4
unsigned char pixelData[4] = { 0, 0, 0, 0 }; 
CGContextRef context = CGBitmapContextCreate(pixelData, 
    1, 
    1, 
    bitsPerComponent, 
    bytesPerRow, 
    colorSpace, 
    kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

unsigned char pixelData[4] = { 0, 0, 0, 0 };をSwiftに翻訳したいと考えています。それはUnsafeMutableRawPointerを使用しなければならないようです。しかし、私は方法がわかりません。CGBitmapContextCreateをObjective-CからSwiftに変換

+0

詳細については、[__Apple Docs__](https://developer.apple.com/documentation/swift/unsafemutablerawpointer)を参照してください。 – holex

答えて

0

ネイティブのSwift配列を使用して、withUnsafeMutableBytesメソッドを呼び出すと、配列の記憶域にUnsafeMutableRawBufferPointerが得られます。 baseAddressプロパティは、バッファのアドレスをUnsafeMutableRawPointer?として取得します。ポインタはあなたがwithUnsafeMutableBytesに渡すクロージャの内部でのみ有効であることを

import CoreGraphics 

var pixelData: [UInt8] = [0, 0, 0, 0] 
pixelData.withUnsafeMutableBytes { pointer in 
    guard let colorSpace = CGColorSpace(name: CGColorSpace.displayP3), 
     let context = CGContext(data: pointer.baseAddress, 
           width: 1, 
           height: 1, 
           bitsPerComponent: 8, 
           bytesPerRow: 4, 
           space: colorSpace, 
           bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) 
    else { 
     return 
    } 
    // Draw a white background 
    context.setFillColor(CGColor.white) 
    context.fill(CGRect(x: 0, y: 0, width: 1, height: 1)) 
} 

print(pixelData) // prints [255, 255, 255, 255] 

注:

は、ここでの例です。グラフィックスコンテキストは、このポインタがコンテキストの存続期間中有効であると仮定しているため、クロージャからコンテキストを戻し、外部からアクセスすることは未定義の動作になります。

withUnsafeMutableBytesが返ってくると、pixelData配列の内容が変更されています。

関連する問題