2017-07-27 1 views
2

Je suis Recadrer une image avec:Pourquoi y a-t-il un bord blanc lors du recadrage d'une image avec UIGraphicsContext?

UIGraphicsBeginImageContext(croppingRect.size) 
let context = UIGraphicsGetCurrentContext() 

context?.clip(to: CGRect(x: 0, y: 0, width: rect.width, height: rect.height))   
image.draw(at: CGPoint(x: -rect.origin.x, y: -rect.origin.y)) 

let croppedImage = UIGraphicsGetImageFromCurrentImageContext() 
UIGraphicsEndImageContext() 

L'image recadrée a parfois un bord blanc 1px à droite et bordure inférieure. Le coin inférieur droit zoomé pour voir les pixels individuels ressemble à ceci. Apparemment, la bordure n'est pas blanche mais des nuances de blanc peuvent provenir d'une compression plus tardive.

enter image description here

Où cet artefact de bord blanc viennent?

+1

J'ai essayé votre code et fonctionne très bien pour moi, pourriez-vous montrer votre rect et recadrerRect –

+0

Merci, a trouvé le problème, voir ma réponse ci-dessous. – Manuel

Répondre

4

Le problème était que les valeurs du croppingRect n'étaient pas des pixels pleins.

Comme les valeurs de x, y, width, height où calculé CGFloat nombres les résultats seraient parfois des nombres fractionnaires (par exemple, au lieu de 1.31.0). La solution a consisté à arrondir ces valeurs:

let cropRect = CGRect(
    x: x.rounded(.towardZero), 
    y: y.rounded(.towardZero), 
    width: width.rounded(.towardZero), 
    height: height.rounded(.towardZero)) 

L'arrondi doit être .towardZero (voir here ce que cela signifie) parce que le rectangle de culture devrait (en général) ne pas être plus grand que le rect image.

+0

Eh bien !! C'est un conseil précieux –