私の迅速なプロジェクトでは、赤、緑、青、アルファ値を変更できるように画像のピクセル値を保持するために2つのクラスがあります。 UnsafeMutableBufferPointer
は、Pixelクラスオブジェクトで構成される多くのビットを保持します。スレッド1:EXC_BAD_ACCESS(コード= EXC_I386_GPFLT)
UnsafeMutableBufferPointer<Pixel>
プロパティを保持するクラスと対話できます。私はそのオブジェクトのすべてのプロパティにアクセスでき、すべて正常に動作します。私がUnsafeMutableBufferPoint<Pixel>
で抱えている唯一の問題は、Pixelオブジェクトでループさせようとしていて、スレッド1でクラッシュしています。EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
例外です。
init!(image: UIImage)
{
_width = Int(image.size.width)
_height = Int(image.size.height)
guard let cgImage = image.cgImage else { return nil }
_width = Int(image.size.width)
_height = Int(image.size.height)
let bitsPerComponent = 8
let bytesPerPixel = 4
let bytesPerRow = _width * bytesPerPixel
let imageData = UnsafeMutablePointer<Pixel>.allocate(capacity: _width * _height)
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: image.size))
_pixels = UnsafeMutableBufferPointer<Pixel>(start: imageData, count: _width * _height)
}
この機能は、プログラムをクラッシュさせる部分です。クラッシュしている部分は、rgba.pixelsをループしているforループです。 rgba.pixelsはUnsafeMutableBufferPointerです。
これはUnsafeMutableBufferPointer<Pixel>
を作成するコンストラクタです。これを行う簡単な方法はありますか?RBGA値を取得して簡単に変更できる方法はありますか?
ピクセルクラスはUInt32
の値で、これは4つのUInt 8
値に分割されています。
私はそれらの値を保持するために間違った構造を使用していますか?もしそうなら、より安全で簡単な構造を使用していますか?または、Pixel値にアクセスする際に何か問題がありますか?