2014-11-05 5 views
2

저는 Swift iOS8에서 작업 중이며 Accelerate.framework를 사용하여 조작을 수행하기 위해 UIImage를 vImage_Buffer로 변환하려고합니다.Swift iOS에서 vImageBuffer_initWithCGImage를 사용하는 중에 "치명적인 오류 : 예상치 않게 찾을 수 없음"옵션을 사용하지 않았습니다.

func initvImageBufferwithUIImage (image:UIImage)-> vImage_Buffer{ 

    var CGImg:CGImageRef = sunset.CGImage 
    var inProvider:CGDataProviderRef = CGImageGetDataProvider(CGImg) 
    var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider) 
    var buffer:vImage_Buffer! 

    var format:vImage_CGImageFormat = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: CGBitmapInfo.ByteOrderDefault, version: 0, decode: nil, renderingIntent: kCGRenderingIntentDefault) 

    vImageBuffer_InitWithCGImage(&buffer!, &format, nil , sunset.CGImage, 0) 

    return buffer 

은 내가 "치명적인 오류가 그것을 실행하려고 더 컴파일 오류와 원자바오가 없습니다 : I 변환을 위해 vImageBuffer_initWithCGImage를 사용하기 위해 노력하고있어, 여기에 내가 노력 코드는 예기치 않게 옵션을 풀기 동안 전무 발견 값 "vImageBuffer_InitWithCGImage 줄에. backgroundColor 인 buffer와 third 매개 변수가 모두 안전하지 않기 때문에 설명서에 따라 UnsafeMutablePointer에 대해 nil 인 null을 받아 들일 것으로 가정 되었기 때문에 왜 그런 일이 발생하는지 확신 할 수 없습니다.

편집 : 괜찮습니까. 적어도 지금은 왜 그런 일이 일어 났는지 이해합니다. 내가 감싸지 않기 때문에 & 버퍼!! 하지만 "vImage_buffer!는 vImage_buffer와 동일하지 않습니다."라는 말로 인해 & 버퍼를 보낼 수 없습니다.

vImage_buffer로 버퍼 선언과 모든 종류의 조합을 시도 했습니까? 하지만 나는 그 일을 가능하게 할 수 없다. 기본적으로 버퍼 함수를 ​​init 함수에 전달하기 위해 버퍼 매개 변수를 할당해야하지만 어떻게해야할지 모르겠다. 제발 도와주세요

답변

1

나는 vImage가 무엇인지 잘 모릅니다. 그러나 사과 문서에서 vImage_Buffer는 vImageBuffer_InitWithCGImage로 파싱하기 전에 본문이 있어야하는 구조체이며 해당 함수는 해당 구조체의 필드를 채 웁니다. 코드의 실제 문제점은 다음과 같습니다.

var buffer:vImage_Buffer! 

위의 옵션은 기본값으로 nil을 갖는 옵션을 만듭니다. 그리고 unwrap 때, 그것은 nil을보고합니다. 왜냐하면 그것은 무 (無)이기 때문입니다. 빈 구조를 만들어 함수에 전달해야합니다. 다음 중 하나를 시도하십시오. 좋아

var buffer:vImage_Buffer = vImage_Buffer() 
    ........ 
    vImageBuffer_InitWithCGImage(&buffer, &format, nil , sunset.CGImage, 0) 
    ........ 
+0

답장을 보내 주셔서 감사합니다. 불행히도 vImage_buffer에 대한 간단한 생성자는 없습니다. 초기화해야합니다. 하지만 올바른 방향을 알려 주셨습니다. – JeniaM

+0

vImage에서 초기화되지 않은 vImage_Buffer가 필요합니다. 해당 저장소 만 존재해야합니다. –

0

내가 원하고 여기에 좋은 사람들에게 vImageBuffer_initWithCGImage하지만, 감사를 사용하는 나는의 CGImage를 통해 반 수동 vImage_Buffer를 초기화하여 해결 방법을 한 일 exectly했다하는 방법을 발견하지 않았다, 그래서. 내 함수가 어떻게 보이는지 그게 :

var buf = vImage_Buffer(data: nil, height: 0, width: 0, rowBytes: 0) 

를 다음 호출 :

func initvImageBufferwithUIImage (image:UIImage)-> vImage_Buffer{ 

    var CGImgRef:CGImageRef = image.CGImage 
    var inProvider:CGDataProviderRef = CGImageGetDataProvider(CGImgRef) 
    var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider) 
    var buffer:vImage_Buffer = vImage_Buffer(data: &inBitmapData, height: 
    CGImageGetHeight(CGImgRef), width: CGImageGetWidth(CGImgRef), rowBytes: 
    CGImageGetBytesPerRow(CGImgRef)) 

    return buffer 

} 
1

그냥 호출하기 전에 더미 vImage_Buffer 객체를 생성

vImageBuffer_InitWithCGImage(&buffer, ...) 

및 vImage 모든 구조체에 기입한다 필드를 올바르게 입력하십시오.