UIImage с CGAffineTransform, нарисованным в CGContext, странный вывод

У меня есть UIView, содержащий UIImageView, я применяю преобразование вращения к UIImageView, а затем хочу нарисовать это изображение с таким же преобразованием вращения в CGContext (и в будущем будут использоваться дополнительные преобразования, такие как перевод и масштаб), у меня есть следующий код для сделать трансформацию и отрисовку в CGContext:

UIImage *image=[UIImage imageNamed:@"cena-1.png"];
CGRect imageFrame=CGRectMake(50, 50, image.size.width, image.size.height);
UIImageView *imageView=[[UIImageView alloc] initWithFrame:imageFrame];
imageView.image=image;
[self.view addSubview:imageView];

CGAffineTransform imageTransform=CGAffineTransformMakeRotation(degreesToRadians(10));
imageView.transform=imageTransform;
NSLog(@"self.imgOverlay.image.scale: %f", imageView.image.scale);

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale);
CGContextRef context = UIGraphicsGetCurrentContext();
UIGraphicsPushContext(context);

CGContextConcatCTM(context, imageView.transform);

CGRect modifiedRect=CGRectApplyAffineTransform(imageFrame, imageTransform);
[imageView.image drawInRect:modifiedRect];

UIGraphicsPopContext();
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

NSString *jpgPath=[NSTemporaryDirectory() stringByAppendingPathComponent:@"test.jpg"];
NSData *imageData=UIImageJPEGRepresentation(outputImage, 1.0);
[imageData writeToFile:jpgPath atomically:YES];

NSLog(@"putputImage path: %@", jpgPath);

.

Проблема в том, что выходное изображение не выглядит так, как показано в UIVIew UIKit, оно перекошено, а положение также неточное, вот скриншот:

введите здесь описание изображения

Подскажите, пожалуйста, что я делаю не так, спасибо за помощь :)

p.s. Я также разместил еще один вопрос (https://stackoverflow.com/questions/17873202/uiimage-drawn-in-cgcontext-with-cgaffinetransform-unexpected-results) с объяснением полного сценария, однако, надеюсь, ответа на этот вопрос будет достаточно.

ОБНОВЛЕНИЕ Я пытался [imageView.image drawAtPoint:modifiedRect.origin]; исправить проблему перекоса (http://screencast.com/t/v2oKkmkd), но проблема с позицией остается :(

ОБНОВЛЕНИЕ 2 Вот тестовый проект с немного измененным кодом: https://github.com/abduliam/TestTransform


person Abduliam Rehmanius    schedule 26.07.2013    source источник
comment
Попробуйте использовать представление PNG... Иногда функция JPEG по необъяснимым причинам не работает, но функция PNG работает.   -  person Dylan Kirkby    schedule 26.07.2013
comment
@DylanKirkby Спасибо за ваш комментарий, попробовал (screencast.com/t/0mgge4LEHRF), не повезло, ситуация сложнее, я думаю, это как-то связано с разницей в системе координат CG и UIKit :)   -  person Abduliam Rehmanius    schedule 26.07.2013


Ответы (1)


Вместо поворота прямоугольника поверните весь контекст рисования, а затем нарисуйте его в этом прямоугольнике.

Например, это нарисует изображение, повернутое на -15 градусов:

    CGRect clipped = CGRectInset(screenRect, 100, 100);
    CGContextRotateCTM(ctx,  -15 * M_PI / 180.0);
    [imageView.image drawInRect: clipped];
person Chris Garrett    schedule 31.12.2014
comment
спасибо, что нашли время и ответили на мой вопрос :) Мне удалось решить проблему, точно не помню, какое было решение, однако его можно увидеть в действии в магазине приложений: itunes.apple.com/gb/app/cena-me-photobooth/id645765826 - person Abduliam Rehmanius; 31.12.2014