2016-09-19 6 views
0

Swift 3でUIImageの特定のピクセルの色を選びたいと思います。このメソッドは〜10k回と呼ばれます。それは〜500個のピクセルを確認した後にクラッシュするのでSwift - UIImageのメモリクラッシュのピクセルカラーを取得する

func pixelColour(_ pixelPosition: CGPoint) { 

    if !CGRect(x: 0.0, y: 0.0, width: self.size.width, height: self.size.height).contains(pixelPosition) { 
     return false 
    } 


    let pointX = trunc(pixelPosition.x); 
    let pointY = trunc(pixelPosition.y); 

    let cgImage = self.cgImage; 
    let width = self.size.width; 
    let height = self.size.height; 

    let colorSpace = CGColorSpaceCreateDeviceRGB(); 
    let bytesPerPixel = 4; 
    let bytesPerRow = bytesPerPixel * 1; 
    let bitsPerComponent = 8; 
    let pixelData = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: 4) 
    let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) 

    let context = CGContext(data: pixelData, width: 1, height: 1, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo.rawValue) 

    context?.setBlendMode(CGBlendMode.copy); 
    context?.translateBy(x: -pointX, y: pointY-CGFloat(height)); 

    // This line takes too much memory, how to release memory here? 
    context?.draw(cgImage!, in: CGRect(x: 0.0, y: 0.0, width: CGFloat(width), height: CGFloat(height))); 




print("\(pixelData[0]) \(pixelData[1]) \(pixelData[2]) ") 
    pixelData.deallocate(capacity: 4) 


} 

は、残念ながらメモリが解放されていないようです。どのように私はこの問題を解決することができますか?

答えて

0

あなたはpixelColourがどのように呼び出されたかを示していませんが、何らかのループの中にあると推測します。もしそうなら、あなたのループを通って蓄積メモリを毎回リリースするautoreleasepool{...}呼び出してpixelColourにあなたの繰り返しの呼び出しを囲む:

let p = // next CGPoint 
autoreleasepool { 
    pixelColour(p) 
} 
0

How do I get the color of a pixel in a UIImage with Swift?

から採取しスウィフト3に

extension UIImage{ 
    func getPixelColor(pos: CGPoint) -> UIColor? { 
     guard let provider=cgImage?.dataProvider else{ 
      return nil 
     } 
     let pixelData = provider.data 
     let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) 

     let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4 

     let r = CGFloat(data[pixelInfo])/CGFloat(255.0) 
     let g = CGFloat(data[pixelInfo+1])/CGFloat(255.0) 
     let b = CGFloat(data[pixelInfo+2])/CGFloat(255.0) 
     let a = CGFloat(data[pixelInfo+3])/CGFloat(255.0) 

     return UIColor(red: r, green: g, blue: b, alpha: a) 
    } 
} 

を変換ポインターを使用するので、画像全体が読み込まれないため、これは大量のメモリを必要としません。

希望すると助かります

関連する問題