2012-11-30 3 views
1

Je souhaite recadrer l'image en fonction de la vue rouge. Il y a quelques points à garder à l'esprit.Recadrer l'image de manière dynamique

1.Image peut être défilé et agrandi. 2.Red ImageView est créé à l'image selon Dynamiquement

UIImage* whole = [UIImage imageNamed:@"9.png"]; //I uses this image 
CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, incX, incY)); 
UIImage* part = [UIImage imageWithCGImage:cgImg]; 

Je veux juste savoir comment trouver les valeurs de

x, y, INCX, INCY

Merci ...

Scénario 1: normal (Non Scrolled)

enter image description here

Résultat attendu (Ignorer Black Border en haut et en bas) enter image description here

Scénario 2: Scrolled

enter image description here

Résultat attendu (Ignorer Black Border en haut et en bas)

enter image description here

Scénario 3: Zoomé

enter image description here

Et même résultat attendu pour le Zoomed One.

Dans tous les cas, je veux les images respectives à l'intérieur du rectangle rouge.

Pour Tout cela, je me sers de ce code ...

-(void)cropClicked:(UIButton*)sender 
    { 
     float zoomScale = 1.0/[mainScrollView zoomScale]; 
     CGRect rect; 
     rect.size.width = [redImageView bounds].size.width * zoomScale ; 
     rect.size.height = [redImageView bounds].size.height * zoomScale ; 
     rect.origin.x = ([mainScrollView bounds].origin.x + redImageView.frame.origin.x); 
     rect.origin.y = ([mainScrollView bounds].origin.y + redImageView.frame.origin.y); 

     CGImageRef cr = CGImageCreateWithImageInRect([[mainImageView image] CGImage], rect); 
     UIImage *cropped = [UIImage imageWithCGImage:cr]; 
     mainImageView.image=cropped; 
     UIImageWriteToSavedPhotosAlbum(cropped, nil, nil, nil); 
     CGImageRelease(cr); 
    } 
+0

Voulez-vous laisser l'utilisateur dessiner ce rect? – HDdeveloper

+0

Non @HDdeveloper Je veux connaître le moment où les X et Y de redImage sont visibles à l'écran, qu'il s'agisse d'un défilement ou d'un zoom. – Anand

Répondre

1

Eh bien, comme @HDdeveloper a dit à juste titre, vous pouvez utiliser CGImageCreateWithImageInRect. Cela prend 2 params, le premier est l'image entière, le second est le cadre que vous voulez recadrer (donc probablement le cadre de votre imageView rouge).
Le problème est que si vous ciblez à la fois rétine/non rétine; Si votre image entière est une image @ 2x et que vous voulez recadrer l'image avec le cadre d'image rouge, vous devez doubler votre image pour obtenir la bonne capture d'écran.
vous pouvez essayer cette méthode:

//Define the screen type: 
#define isRetinaDisplay [[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] && ([UIScreen mainScreen].scale == 2.0) 

- (UIImage*)cropInnerImage:(CGRect)rect { 
    //Take a screenshot of the whole image 
    UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0.0); 
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage* ret = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    CGRect rct; 
    //Double the frame if you're in retina display 
    if (isRetinaDisplay) { 
     rct=CGRectMake(rect.frame.origin.x*2, rect.frame.origin.y*2, rect.size.width*2, rect.size.height*2); 
    } else { 
     rct=rect; 
    } 
    //Crop the image from the screenshot 
    CGImageRef imageRef = CGImageCreateWithImageInRect([ret CGImage], rct); 
    UIImage *result = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    //Save and open the result images with Preview.app 
    [UIImagePNGRepresentation(result) writeToFile: @"/tmp/testCrop.png" atomically: YES]; 
    system("open /tmp/testCrop.png"); 
    [UIImagePNGRepresentation(ret) writeToFile: @"/tmp/testRet.png" atomically: YES]; 
    system("open /tmp/testRet.png"); 
    // 
    return result; 
} 

Lorsque le paramètre rect doit être votre cadre d'image rouge et self.view.frame doit être égale à la wholeImageView.frame. Vous pouvez sauter les 4 dernières lignes, ce sont juste pour voir dans votre Mac ce que vous recadrez. PS: j'utilise cette méthode pour recadrer une image et la définir comme arrière-plan de UIView, c'est la raison pour laquelle je dois doubler frame.

+0

Merci beaucoup @Mat mais comment puis-je calculer le rect qui est passé à cette méthode qui n'est pas le rectangle – Anand

+0

de redImage si je passe redImage Rect alors l'image sera toujours recadrée avec x et y de redImage et comme je l'ai déjà mentionné mon image peut être écaillée et zoomée aussi – Anand

+0

donc im recherchant le X et Y exact pour le rect La taille et la largeur peuvent être dérivées de l'échelle de zoom de ScrollView – Anand

0

Vous pouvez utiliser CGImageRef passer votre rect dans l'image. Ensuite, appelez ce sur le bouton cliquez

UIImage* whole = [UIImage imageNamed:@"9.png"]; //I uses this image 
    CGImageRef cgImg = CGImageCreateWithImageInRect(whole.CGImage, CGRectMake(x, y, incX, incY)); 
    UIImage* part = [UIImage imageWithCGImage:cgImg]; 
+0

Merci pour votre intérêt, mais, je veux savoir comment vous trouvez x, y, incX, INCY – Anand

+0

@ Anand, vous pouvez utiliser l'échelle de zoom de l'image pour déterminer cela. – HDdeveloper