2011-08-17 2 views
26

Existe-t-il une API d'image de recadrage pour l'objectif C qui recadre dynamiquement les images dans le projet Xcode? S'il vous plaît fournir quelques astuces ou techniques comment puis-je recadrer les images de la caméra dans l'iPhone.API de recadrage d'image pour iOS

Répondre

1

Vous pouvez utiliser l'infrastructure CoreGraphics pour rogner dynamiquement l'image. Voici un exemple de partie de code de recadrage d'image dynamique. J'espère que cela vous sera utile.

- (void)drawMaskLineSegmentTo:(CGPoint)ptTo withMaskWidth:(CGFloat)maskWidth inContext:(NXMaskDrawContext)context{  
     if (context == nil)   
      return;  
     if (context.count <= 0){ 
      [context addObject:[NSValue valueWithCGPoint:ptTo]]; 
      return; 
     }   
     CGPoint ptFrom = [context.lastObject CGPointValue];    
     UIGraphicsBeginImageContext(self.maskImage.size); 
     [self.maskImage drawInRect:CGRectMake(0, 0, self.maskImage.size.width, self.maskImage.size.height)];  
     CGContextRef graphicsContext = UIGraphicsGetCurrentContext();   
     CGContextSetBlendMode(graphicsContext, kCGBlendModeCopy);  
     CGContextSetRGBStrokeColor(graphicsContext, 1, 1, 1, 1);  
     CGContextSetLineWidth(graphicsContext, maskWidth);    
     CGContextSetLineCap(graphicsContext, kCGLineCapRound);  
     CGContextMoveToPoint(graphicsContext, ptFrom.x, ptFrom.y);  
     CGContextAddLineToPoint(graphicsContext, ptTo.x, ptTo.y);  
     CGContextStrokePath(graphicsContext); 
     self.maskImage = UIGraphicsGetImageFromCurrentImageContext();  
     UIGraphicsEndImageContext();   

     UIGraphicsBeginImageContext(self.displayableMaskImage.size);  
     [self.displayableMaskImage drawInRect:CGRectMake(0, 0, self.displayableMaskImage.size.width, self.displayableMaskImage.size.height)];  
     graphicsContext = UIGraphicsGetCurrentContext();  
     CGContextSetBlendMode(graphicsContext, kCGBlendModeCopy);  
     CGContextSetStrokeColorWithColor(graphicsContext, self.displayableMaskColor.CGColor);  
     CGContextSetLineWidth(graphicsContext, maskWidth);  
     CGContextSetLineCap(graphicsContext, kCGLineCapRound);  
     CGContextMoveToPoint(graphicsContext, ptFrom.x, ptFrom.y);  
     CGContextAddLineToPoint(graphicsContext, ptTo.x, ptTo.y);  
     CGContextStrokePath(graphicsContext); 
     self.displayableMaskImage = UIGraphicsGetImageFromCurrentImageContext();  
     UIGraphicsEndImageContext();   
     [context addObject:[NSValue valueWithCGPoint:ptTo]]; 
} 
18

Vous pouvez utiliser un code simple ci-dessous pour rogner une image. Vous devez passer l'image et le CGRect qui est la zone de culture. Ici, je recadre l'image de façon à obtenir une partie centrale de l'image originale et l'image retournée est carrée.

// Returns largest possible centered cropped image. 
- (UIImage *)centerCropImage:(UIImage *)image 
{ 
    // Use smallest side length as crop square length 
    CGFloat squareLength = MIN(image.size.width, image.size.height); 
    // Center the crop area 
    CGRect clippedRect = CGRectMake((image.size.width - squareLength)/2, (image.size.height - squareLength)/2, squareLength, squareLength); 

    // Crop logic 
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], clippedRect); 
    UIImage * croppedImage = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    return croppedImage; 
} 
+0

Brillant! Fonctionne comme une brise sur iOS 7. Merci! –

1

Xcode 5, iOS 7 et exemple d'écran de 4 pouces: Voici un exemple open source d'un SimpleImageCropEditor (Project Zip and Source Code Example. Vous pouvez charger l'éditeur de recadrage d'image en tant que contrôleur de vue modal et le réutiliser. Regardez le code et s'il vous plaît laissez des commentaires constructifs concernant si cet exemple de code répond à la question "Image Cropping API pour iOS".

Démonstration, est un exemple de code source Objective-C, utilisation de UIImagePickerController, @protocol, UIActionSheet, UIScrollView, UINavigationController, MFMailComposeViewController et UIGestureRecognizer.

10

EDIT - Version Swift

let imageView = UIImageView(image: image) 
imageView.contentMode = .scaleAspectFill 
imageView.clipsToBounds = true 

Toutes ces solutions semblent assez compliquées et beaucoup d'entre eux la qualité effectivement subi une dégradation de l'image. Vous pouvez faire beaucoup plus simple en utilisant les méthodes prêtes à l'emploi UIImageView.

Objective-C

self.imageView.contentMode = UIViewContentModeScaleAspectFill; 
[self.imageView setClipsToBounds:YES]; 
[self.imageView setImage:img]; 

Cela recadrer l'image en fonction des dimensions que vous avez défini votre UIImageView (je l'ai appelé le mien imageView ici).
C'est aussi simple que cela et fonctionne beaucoup mieux que les autres solutions.

+0

Je pense que votre réponse redimensionne simplement l'image temporairement dans les limites de 'UIImageView'. Si vous êtes uniquement concerné par l'affichage de l'image, cela fonctionnera. Toutefois, si, par exemple, vous devez modifier l'image avant de la télécharger sur un serveur, cette approche ne fonctionnerait pas dans ce cas. – Andrew

+0

Vrai mais il cherche une manière qui "recadre dynamiquement les images", donc ma suggestion est parfaitement bien ici. – sf89