2011-08-17 7 views
26

Xcodeプロジェクトで画像を動的にトリミングする対象C用のクロッピング画像APIはありますか?どのように私はiPhoneでカメラの画像をトリミングすることができますいくつかのトリックやテクニックを提供してください。Image iOS用クロッピングAPI

答えて

1

CoreGraphicsフレームワークを使用して、イメージを動的にトリミングすることができます。 ここでは、動的イメージトリミングのコード部分の例を示します。これがあなたに役立つことを願っています。

- (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

以下の簡単なコードを使用して画像をトリミングすることができます。画像と切り取り領域であるCGRectを渡す必要があります。ここでは、元の画像の中央部分を取得し、返される画像が正方形になるように画像をトリミングします。

// 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

ブリリアント! iOS 7の風のように動作します。ありがとう! –

1

のXcode 5、IOSの7、及び4インチの画面例:ここ SimpleImageCropEditor (Project Zip and Source Code Exampleのオープンソースの一例です。 Image Crop Editorをモーダルビューコントローラとしてロードして再利用することができます。コードを見て、このサンプルコードが「iOS向け画像クロッピングAPI」の質問に答えるかどうかについて建設的なコメントを残してください。

例のソースObjective-Cコード、UIImagePickerController、@protocol、UIActionSheet、UIScrollView、UINavigationController、MFMailComposeViewController、およびUIGestureRecognizerの使用例です。

10

EDIT - スウィフトバージョン

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

すべてのこれらのソリューションは、実際に品質に画像を劣化させる、非常に複雑で、それらの多くいるようです。 UIImageViewのすぐに使用できる方法を使用すると、はるかに簡単に行うことができます。

のObjective-C

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

これはあなたのUIImageView(私はここに私のimageView呼ばれてきた)のために設定した寸法に基づいて画像をトリミングします。
これは単純で、他のソリューションよりもはるかに優れています。

+0

あなたの答えは単に 'UIImageView'の範囲内で一時的にイメージのサイズを変更すると思います。画像の表示のみに関心がある場合は、これが機能します。ただし、たとえば、サーバーにアップロードする前にイメージを変更する必要がある場合は、この方法は機能しません。 – Andrew

+0

真実ですが、彼女は「画像を動的に作っていきます」という方法を探しているので、私の提案はここではまったく問題ありません。 – sf89