2017-04-01 10 views
0

이미지의 알파를 계산하는 기능이 있습니다. 하지만 iPhone 5에서 충돌이 발생했으며 iPhone 6 이상에서는 문제가 없습니다.알파 받기 이미지 스위프트

private func alphaOnlyPersentage(img: UIImage) -> Float { 

    let width = Int(img.size.width) 
    let height = Int(img.size.height) 

    let bitmapBytesPerRow = width 
    let bitmapByteCount = bitmapBytesPerRow * height 

    let pixelData = UnsafeMutablePointer<UInt8>.allocate(capacity: bitmapByteCount) 

    let colorSpace = CGColorSpaceCreateDeviceGray() 

    let context = CGContext(data: pixelData, 
          width: width, 
          height: height, 
          bitsPerComponent: 8, 
          bytesPerRow: bitmapBytesPerRow, 
          space: colorSpace, 
          bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.alphaOnly.rawValue).rawValue)! 

    let rect = CGRect(x: 0, y: 0, width: width, height: height) 
    context.clear(rect) 
    context.draw(img.cgImage!, in: rect) 

    var alphaOnlyPixels = 0 

    for x in 0...Int(width) { 
     for y in 0...Int(height) { 

      if pixelData[y * width + x] == 0 { 
       alphaOnlyPixels += 1 
      } 
     } 
    } 

    free(pixelData) 

    return Float(alphaOnlyPixels)/Float(bitmapByteCount) 
} 

제발 도와주세요. 고맙습니다. 죄송합니다 iOS 코딩 초보자입니다.

+0

어떤 종류의? – Sulthan

+0

당신은 항상 모든 픽셀을 반복하므로, let alphaOnlyPixels = Array (pixelData.filter {$ 0 == 0}). count' – Sulthan

+0

EXC_BASS_ACCESS로 충돌이 발생했습니다. 스크린 샷을 캡처했습니다 -> [link] (http://imgur.com/a/QT3wk) – Quyen

답변

0

.....<으로 바꾸십시오. 그렇지 않으면 한 행과 한 열을 너무 많이 액세스하게됩니다.

메모리가 할당되는 방법과 할당 된 청크 외부에있는 주어진 주소의 바이트에 대한 액세스 권한이 있는지 여부에 따라 충돌이 임의로 발생합니다.

또는 간단하여 반복 교체 :

for i in 0 ..< bitmapByteCount { 
    if pixelData[i] == 0 { 
     alphaOnlyPixels += 1 
    } 
} 

당신은 또한 당신의 바이트를 만들 Data을 사용할 수 있습니다, 나중에 단순화 반복 : 충돌의

var pixelData = Data(count: bitmapByteCount) 

pixelData.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer<UInt8>) in 
    let context = CGContext(data: bytes, 
          width: width, 
          height: height, 
          bitsPerComponent: 8, 
          bytesPerRow: bitmapBytesPerRow, 
          space: colorSpace, 
          bitmapInfo: CGImageAlphaInfo.alphaOnly.rawValue)! 

    let rect = CGRect(x: 0, y: 0, width: width, height: height) 
    context.clear(rect) 
    context.draw(img.cgImage!, in: rect) 
} 

let alphaOnlyPixels = pixelData.filter { $0 == 0 }.count 
+0

픽셀 데이터가 UnsafeMutablePointer .allocate (용량 : bitmapByteCount)이므로 픽셀 데이터가 프로토콜 시퀀스를 따르지 않습니다. 필터가 없습니다. ( – Quyen

+0

@Quyen 맞습니다. 수정이 계속 될 것입니다. 질문의 두 번째 부분을 약간 업데이트 할 것입니다. – Sulthan

+0

고맙습니다. – Quyen