2017-02-15 8 views
0

내 코드에서 언 래핑을 줄이려고하지만 때로는 if let 체크가 필요하지 않은지보고 싶지도 않습니다.UIImagePickerController의 이미지에 CGImage 값이 없을 수 있습니까?

사용자가 자신의 카메라로 사진을 찍거나 전화 라이브러리에서 사진을 찍고 코드를 잘라내어 압축하는 코드의 특정 부분에 많은 힘이 없어졌습니다. 이것은 모든 힘으로 프로세스가 언랩입니다 :

  1. 나는 imagePickerController(picker: didFinishPickingMediaWithInfo:) 함수에서 포장을 벗긴 이미지를 강제로 : 나는 imagePicker.mediaTypes = [kUTTypeImage as String]이 있기 때문에

    let pickedImage = info[UIImagePickerControllerOriginalImage] as! UIImage` 
    

    나는 이것에 대해 꽤 안심.

  2. 이미지를 자르려면 CGImageCreateWithImageInRect을 사용하고 첫 번째 매개 변수는 CGImage입니다. 이것이 내가 생각한 가장 큰 가정이며 충돌은 한번도 없었지만 여전히 안전하지 않다는 것을 알고 있습니다.

    let cgImage = CGImageCreateWithImageInRect(pickedImage.CGImage!, cropRect) 
    let croppedImage = UIImage(CGImage: cgImage) 
    
  3. 나는 NSData을 반환 UIImageJPEGRepresentation를 사용하지만 이미지가 더 CGImageRef가없는 경우 nil를 반환 할 수 있습니다. 나는 이전의 가정에 기초하여 그것을 풀도록 강요한다. 내가 jpegDatanil하지 가정 때문에

    let jpegData = UIImageJPEGRepresentation(croppedImage, 0.85) 
    
  4. 은 다시 풀기 힘에 의해 결과 이미지를 만들 수 있습니다.

    let resultImage = UIImage(data: jpegData)! 
    

TLDR : 그것은 UIImagePickerControllerCGImage이없는 이미지를 반환 할 수 있습니까? 예인 경우 1 단계와 2 단계 사이에 수표를 추가하여 CGImage 값이 있는지 확인합니다. 여전히 안전하게 다른 단계의 포장을 풀 수 있습니까?

+0

당신이'pickedImage' 객체에 데이터를 받고 있습니까? – CodeChanger

+0

@CodeChanger 위에서 언급 한 모든 코드 (지금까지). 나는 미래의 잠재적 문제를 피하기 위해 그것을 수정하려하고있다. 즉, 예, 데이터를 pickedImage로 가져옵니다. – budidino

답변

0

있는 UIImage 이미지 = 관리자

CIImage = "레시피"원시의 이미지하지하지만 (속성 배열, 색상 공간, URL (또는 비디오의 픽셀 버퍼) 등)

CGImage = 원시 비트 맵 이미지

예, 때때로 UIImage가 cg없이 나타날 수 있습니다. 하지만 '제조법' 대신에 직접 CG를 만들어보십시오. 당신거야 컨텍스트와 'createCGImage'에 대한 호출 :

if let cg = pickedImage!.cgImage { 
    // you've got a CG :) 
} else { 
    // make CG yourself from CIImage 
    if let ci = pickedImage!.ciImage { 
     let context = CIContext() 
     guard let cgImage = context.createCGImage(ci, from: ci.extent) else { return } 
     let croppedImage = UIImage(cgImage: cgImage)  
    } 
}