缩放UIImage / CGImage

时间:2012-01-22 05:48:57

标签: ios image-processing uiimage core-graphics cgimage

我正在使用AVFoundation在相机应用中实现缩放功能。我正在缩放我的预览视图:

[videoPreviewView setTransform:CGAffineTransformMakeScale(cameraZoom, cameraZoom)];

现在,在拍完照片后,我希望在将照片保存到相机胶卷之前使用cameraZoom值进行缩放/裁剪。我该怎么做才能做到最好?

编辑:使用贾斯汀的回答:

CGRect imageRect = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height);

CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], imageRect);

CGContextRef bitmapContext = CGBitmapContextCreate(NULL, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef), CGImageGetBitsPerComponent(imageRef), CGImageGetBytesPerRow(imageRef), CGImageGetColorSpace(imageRef), CGImageGetBitmapInfo(imageRef));

CGContextScaleCTM(bitmapContext, scale, scale);
CGContextDrawImage(bitmapContext, imageRect, imageRef);

CGImageRef zoomedCGImage = CGBitmapContextCreateImage(bitmapContext);

UIImage* zoomedImage = [[UIImage alloc] initWithCGImage:imageRef];

它正在缩放图像,但它没有占据它的中心,而是似乎占据了右上角区域。 (我不是肯定的。)

另一个问题(我应该在OP中更清楚)是图像保持相同的分辨率,但我宁愿将其裁剪掉。

2 个答案:

答案 0 :(得分:6)

+ (UIImage*)croppedImageWithImage:(UIImage *)image zoom:(CGFloat)zoom
{
    CGFloat zoomReciprocal = 1.0f / zoom;

    CGPoint offset = CGPointMake(image.size.width * ((1.0f - zoomReciprocal) / 2.0f), image.size.height * ((1.0f - zoomReciprocal) / 2.0f));
    CGRect croppedRect = CGRectMake(offset.x, offset.y, image.size.width * zoomReciprocal, image.size.height * zoomReciprocal);

    CGImageRef croppedImageRef = CGImageCreateWithImageInRect([image CGImage], croppedRect);

    UIImage* croppedImage = [[UIImage alloc] initWithCGImage:croppedImageRef scale:[image scale] orientation:[image imageOrientation]];

    CGImageRelease(croppedImageRef);

    return croppedImage;
}

答案 1 :(得分:1)

缩放/缩放:

  • 创建CGBitmapContext
  • 改变上下文的变换(CGContextScaleCTM
  • 绘制图像(CGContextDrawImage) - 您传递的矩形可用于偏移原点和/或尺寸。
  • 从上下文(CGBitmapContextCreateImage
  • 生成新的CGImage

裁剪:

  • 创建CGBitmapContext。传递NULL,因此上下文创建的是位图的缓冲区。
  • 按原样绘制图像(CGContextDrawImage
  • 为裁剪创建CGBitmapContext(使用新尺寸),使用缓冲区的第一个上下文像素数据的偏移量。
  • 从第二个上下文(CGBitmapContextCreateImage
  • 生成一个新的CGImage