Масштабирование UIImage/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];

Он масштабирует изображение, но не в его центре, а, кажется, в верхней правой области. (я не уверен).

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


person Community    schedule 22.01.2012    source источник


Ответы (1)


для масштабирования/увеличения:

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

обрезать:

  • создать CGBitmapContext. передайте NULL, чтобы созданный контекст был буфером для растрового изображения.
  • нарисовать изображение как есть (CGContextDrawImage)
  • создайте CGBitmapContext для обрезки (с новыми размерами), используя смещение пиксельных данных первого контекста для буфера.
  • создать новый CGImage из второго контекста (CGBitmapContextCreateImage)
person justin    schedule 22.01.2012
comment
@Джей, я могу написать это… кажется, в этом сценарии есть небольшой дисбаланс усилий - с чем ты борешься? - person justin; 23.01.2012
comment
:p Последние 4 аргумента метода CGContextRef CGBitmapContextCreate ( void *data, size_t width, size_t height, size_t bitsPerComponent, size_t bytesPerRow, CGColorSpaceRef colorspace, CGBitmapInfo bitmapInfo). - person ; 23.01.2012
comment
@Jay, попробуй это: CGImageRef source = ???; \n CGContextRef gtx = CGBitmapContextCreate(NULL, CGImageGetWidth(source), CGImageGetHeight(source), CGImageGetBitsPerComponent(source), CGImageGetBytesPerRow(source), CGImageGetColorSpace(source), CGImageGetBitmapInfo(source)); ;) - person justin; 23.01.2012
comment
@Jay, чтобы изменить его происхождение, вам придется сместить происхождение прямоугольника, который вы передаете CGContextDrawImage. - person justin; 23.01.2012
comment
У меня это работает другим методом, но спасибо за помощь. - person ; 23.01.2012