2

Je dois recadrer UIImage qui est chargé dans UIScrollview avec quelques rect d'un autre UIView qui est également dans UIScrollViewConvertir UIScrollViewPoint à UIImage + ZOOM + TOURNER

Suite est Afficher la hiérarchie

--> View 
    --> UIScrollView 
     --> viewBase (UIView) 
      --> UIImageView -> (Zoomed & rotated) 
      --> UIView (Target View)(Movable User can move anywhere in scrollview to crop rect) 

Mon image est Rotation & Agrandissement Je dois obtenir la partie exacte de l'image dans TargetView

Je dessine UIImage avec rotati sur le context suivant est le code

CGFloat angleCroppedImageRetreacted = atan2f(self.imgVPhoto.transform.b, self.imgVPhoto.transform.a); 
angleCroppedImageRetreacted = angleCroppedImageRetreacted * (180/M_PI); 

UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.imgVPhoto.image.size.width, self.imgVPhoto.image.size.height)]; 
rotatedViewBox.transform = CGAffineTransformMakeRotation(-angleCroppedImageRetreacted); 
CGSize rotatedSize = rotatedViewBox.frame.size; 

UIGraphicsBeginImageContext(rotatedSize); 
CGContextRef bitmap = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(bitmap, rotatedSize.width/2.0f, rotatedSize.height/2.0f); 
CGContextRotateCTM(bitmap, -angleCroppedImageRetreacted); 
CGContextScaleCTM(bitmap, 1.0f, -1.0f); 



CGContextDrawImage(bitmap, CGRectMake(-self.imgVPhoto.image.size.width/2.0f, 
             -self.imgVPhoto.image.size.height/2.0f, 
             self.imgVPhoto.image.size.width, 
             self.imgVPhoto.image.size.height), 
        self.imgVPhoto.image.CGImage); 
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext(); 




UIGraphicsEndImageContext(); 

Et cela fonctionne très bien. Je reçois pivotée UIImage même que je peux voir dans Simulator

Pour convertir Point de vue cible à UIImage j'utiliser le code suivant qui ne fonctionne pas

CGPoint imageViewPoint = [self.viewBase convertPoint:self.targetImageview.center toView:self.imgVPhoto]; 

float percentX = imageViewPoint.x/self.imgVPhoto.frame.size.width; 
float percentY = imageViewPoint.y/self.imgVPhoto.frame.size.height; 

CGPoint imagePoint = CGPointMake(resultImage.size.width * percentX, resultImage.size.height * percentY); 

rect.origin = imagePoint; 

//rect.origin.x *= (self.imgVPhoto.image.size.width/self.imgVPhoto.frame.size.width); 
//rect.origin.y *= (self.imgVPhoto.image.size.height/self.imgVPhoto.frame.size.height); 


imageRef = CGImageCreateWithImageInRect([resultImage CGImage], rect); 
img = [UIImage imageWithCGImage:imageRef scale:viewImage.scale orientation:viewImage.imageOrientation]; 

Je pense que problème est que nous ne pouvons pas utiliser Rect après transformons Appliquer

S'il vous plaît Aide-moi à recadrer UIImage qui est zoomée et tourné à partir rect sur la même hiérarchie

Si vous besoin de plus d'informations pls demander

+0

Quelle est votre relation entre la vue cible et affichage de l'image? Je suis sceptique sur le fait que le code de rotation fonctionnera si UIImage a une orientation (essayez de prendre une photo de portrait en cours d'exécution et mettez-la sous plusieurs angles pour confirmer qu'elle fonctionne vraiment). Si vous suspectez que l'extraction de la vue transformée est un problème, utilisez une approche standard où vous enregistrez la transformation actuelle dans une variable locale, définissez la transformation de la vue sur identité, sauvegardez la vue dans une variable locale. –

+0

Malheureusement, l'extraction de coordonnées à partir de la vue déroulante est un peu une procédure d'essai et d'erreur. Puis, tout dessiner dans un contexte graphique peut être gênant et tout s'aggrave lorsque l'image est pivotée. Mais si votre vue est correctement dessinée et que vous voyez déjà exactement ce dont vous avez besoin, vous devriez peut-être envisager de créer un cliché de vue. Supposons que votre vue d'image se trouve sur une autre vue, qui correspond à la taille et à la position de votre vue cible. Créez ensuite un instantané de cette vue à tout moment pour obtenir l'image. Vous voudrez peut-être l'agrandir un peu pour augmenter la taille de l'image de sortie un peu ... –

+0

@MaticOblak cible vue est un petit UIView (Circle) qui est une partie à être ** crop ** signifie qu'il est mobile UIView qui mis par l'utilisateur recadre une partie spécifique dans la vue de l'image –

Répondre

0

Je réponds à ma propre question.

Merci à Matic pour donner une idée

j'ai changé une logique

J'ai réalisé mêmes fonctionnalités que je recherche

CGPoint locationInImageView = [self.viewBase convertPoint:self.targetImageview.center toView:self.view]; // received from touch 
locationInImageView = [self.view convertPoint:locationInImageView toView:self.imgVPhoto]; 

// I GOT LOCATION IN UIIMAGEVIEW OF TOUCH POINT 

UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0); 

[self.imgVPhoto.layer renderInContext:UIGraphicsGetCurrentContext()]; 

UIImage *img1 = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

// I GOT UIIMAGE FROM CURRENT CONTEXT 

CGFloat width = self.targetImageview.frame.size.width * self.zoomScale ; 
CGFloat height = self.targetImageview.frame.size.height * self.zoomScale ; 

//2 IS SCALE FACTOR 

CGFloat xPos = (locationInImageView.x * 2) - width/2; 
CGFloat yPos = (locationInImageView.y * 2) - height/2; 

CGRect rect1 = CGRectMake(xPos, yPos, width, height); 

CGImageRef imageRef = CGImageCreateWithImageInRect([img1 CGImage], rect1); 


// YAHHH YOU HAVE EXACT IMAGE 
UIImage *img = [UIImage imageWithCGImage:imageRef scale:img1.scale orientation:img1.imageOrientation];