2017-09-29 4 views
3

J'ai un problème étrange où après avoir recadré une photo de ma photothèque, il ne peut pas être affiché à partir de l'App. Il me donne cette erreur après avoir exécuté ce code:Strange CoreImage problèmes de culture rencontrent ici

 self.correctedImageView.image = UIImage(ciImage: correctedImage) 

[api] -[CIContext(CIRenderDestination) _startTaskToRender:toDestination:forPrepareRender:error:] The image extent and destination extent do not intersect.

Voici le code que j'ai utilisé pour recadrer et afficher. (InputImage est CIImage)

let imageSize = inputImage.extent.size 
    let correctedImage = inputImage 
     .cropped(to: textObvBox.boundingBox.scaled(to: imageSize)) 
    DispatchQueue.main.async { 
     self.correctedImageView.image = UIImage(ciImage: correctedImage) 
    } 

Plus d'info: Debug imprimer l'étendue de la inputImage et correctedImage

Printing description of self.inputImage: CIImage: 0x1c42047a0 extent [0 0 3024 4032]>

crop [430 3955 31 32] extent=[430 3955 31 32] affine [0 -1 1 0 0 4032] extent=[0 0 3024 4032] opaque affine [1 0 0 -1 0 3024] extent=[0 0 4032 3024] opaque colormatch "sRGB IEC61966-2.1"_to_workingspace extent=[0 0 4032 3024] opaque IOSurface 0x1c4204790(501) seed:1 YCC420f 601 alpha_one extent=[0 0 4032 3024] opaque

Le plus drôle est que quand je mets un point d'arrêt, en utilisant Xcode, j'ai pu afficher un aperçu du image recadrée correctement. Je ne suis pas sûr de ce que cette mesure est pour CIImage, mais UIMageView ne l'aime pas quand je lui assigne l'image recadrée. Une idée de ce que fait cette chose?

+0

CoreImage fonctionne sur un plan infini. L'étendue est le rectangle dans ce plan qui contient réellement les données d'image qui vous intéressent. –

+0

Comment changer l'étendue? – mskw

+0

Lorsque j'applique cela à un uiimageview il ne me laisse pas – mskw

Répondre

2

J'ai rencontré le même problème que vous avez décrit. En raison d'un comportement étrange dans UIKit/CoreImage, j'avais besoin de convertir le CIImage en un CGImage en premier. J'ai remarqué que c'est seulement arrivé quand j'ai appliqué quelques filtres au CIImage, décrit ci-dessous.

let image = /* my CIImage */ 
let goodImage = UIImage(ciImage: image) 
uiImageView.image = goodImage // works great! 


let image = /* my CIImage after applying 5-10 filters */ 
let badImage = UIImage(ciImage: image) 
uiImageView.image = badImage // empty view! 

Voici comment je l'ai résolu.

let ciContext = CIContext() 
let cgImage = self.ciContext.createCGImage(image, from: image.extent) 
uiImageView.image = UIImage(cgImage: cgImage) // works great!!! 

Comme d'autres commentateurs ont déclaré la création d'une attention CIContext trop souvent; C'est une opération coûteuse.