适用于iOS的Image Cropping API

时间:2011-08-17 02:46:34

标签: objective-c image crop

是否有任何裁剪图像API用于在Xcode项目中动态裁剪图像的目标C?请提供一些技巧或技巧,如何在iPhone中裁剪相机图像。

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:10)

编辑 - Swift版本

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

所有这些解决方案看起来都非常复杂,其中许多解决方案实际上降低了图像的质量。 使用UIImageView开箱即用的方法,您可以做得更简单。

<强>目标C

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

这将根据您为UIImageView设置的尺寸裁剪图像(我在这里称为imageView)。
它比其他解决方案更简单,效果更好。

答案 2 :(得分: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]]; 
} 

答案 3 :(得分:1)

Xcode 5,iOS 7和4英寸屏幕示例:这是一个开源示例 SimpleImageCropEditor (Project Zip and Source Code Example。您可以将图像裁剪编辑器作为模态视图控制器加载并重复使用。查看代码,请留下有关此示例代码是否回答“Image Cropping API for iOS”问题的建设性意见。

演示,是示例源Objective-C代码,使用UIImagePickerController,@ protocol,UIActionSheet,UIScrollView,UINavigationController,MFMailComposeViewController和UIGestureRecognizer。