CropImage的现有实现:to:andScaleTo:和straightenAndScaleImage()?

时间:2009-05-15 03:39:00

标签: objective-c uiimagepickercontroller scale crop

我正在编写代码来使用UIImagePickerController。 Corey此前发布了与裁剪和缩放相关的some nice sample code on SO。但是,它没有cropImage的实现:to:andScaleTo:也不是straightenAndScaleImage()。

以下是它们的使用方式:

newImage =  [self cropImage:originalImage to:croppingRect andScaleTo:scaledImageSize];
...
UIImage *rotatedImage = straightenAndScaleImage([editInfo objectForKey:UIImagePickerControllerOriginalImage], scaleSize);

由于我确定某人必须使用与Corey的示例代码非常相似的东西,因此可能存在这两个函数的现有实现。有人愿意分享吗?

1 个答案:

答案 0 :(得分:1)

如果您查看链接到的帖子,您会看到指向apple dev论坛的链接,我在这里找到了一些代码,以下是您要问的方法。注意:我可能已经对数据类型做了一些更改,但我不记得了。如果需要,你应该调整它是微不足道的。

- (UIImage *)cropImage:(UIImage *)image to:(CGRect)cropRect andScaleTo:(CGSize)size {
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGImageRef subImage = CGImageCreateWithImageInRect([image CGImage], cropRect);
CGRect myRect = CGRectMake(0.0f, 0.0f, size.width, size.height);
CGContextScaleCTM(context, 1.0f, -1.0f);
CGContextTranslateCTM(context, 0.0f, -size.height);
CGContextDrawImage(context, myRect, subImage);
UIImage* croppedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRelease(subImage);
return croppedImage;

}

UIImage *straightenAndScaleImage(UIImage *image, int maxDimension) {

CGImageRef img = [image CGImage];
CGFloat width = CGImageGetWidth(img);
CGFloat height = CGImageGetHeight(img);
CGRect bounds = CGRectMake(0, 0, width, height);
CGSize size = bounds.size;
if (width > maxDimension || height > maxDimension) {
    CGFloat ratio = width/height;
    if (ratio > 1.0f) {
        size.width = maxDimension;
        size.height = size.width / ratio;
    }
    else {
        size.height = maxDimension;
        size.width = size.height * ratio;
    }
} 

CGFloat scale = size.width/width;
CGAffineTransform transform = orientationTransformForImage(image, &size);
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
// Flip 
UIImageOrientation orientation = [image imageOrientation];
if (orientation == UIImageOrientationRight || orientation == UIImageOrientationLeft) {

    CGContextScaleCTM(context, -scale, scale);
    CGContextTranslateCTM(context, -height, 0);
}else {
    CGContextScaleCTM(context, scale, -scale);
    CGContextTranslateCTM(context, 0, -height);
}
CGContextConcatCTM(context, transform);
CGContextDrawImage(context, bounds, img);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;

}