Масштабирование UIImage / CGImage - PullRequest
2 голосов
/ 22 января 2012

Я реализую функцию масштабирования в приложении камеры, используя 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];

Это увеличение изображения, но оно не берет его центр, а, кажется, принимаетверхняя правая область.(Я не уверен).

Другая проблема, (я должен был быть более ясным в ОП), состоит в том, что изображение остается в том же разрешении, но я бы просто обрезал его.

Ответы [ 2 ]

6 голосов
/ 23 января 2012
+ (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 голос
/ 22 января 2012

в масштабе / увеличении:

  • создать CGBitmapContext
  • изменить преобразование контекста (CGContextScaleCTM)
  • нарисовать изображение (CGContextDrawImage) - передаваемый прямоугольник может использоваться для смещения начала координат и / или размеров.
  • создает новый CGImage из контекста (CGBitmapContextCreateImage)

для обрезки:

  • создать CGBitmapContext.передайте NULL, чтобы контекст создал буфер для растрового изображения.
  • нарисовать изображение как есть (CGContextDrawImage)
  • создать CGBitmapContext для кадрирования (с новыми размерами),используя смещение пиксельных данных первого контекста для буфера.
  • генерирует новый CGImage из второго контекста (CGBitmapContextCreateImage)
...