Применение преобразованного слоя изображения к renderInContext: - PullRequest
10 голосов
/ 07 сентября 2011

Фон

Я использую пример поваренной книги Эрики Садунс из Chapter 8, Example 14 — Resize and Rotate, чтобы явно изменить размер и повернуть UIImageView.

Просмотр иерархии

1.) Полосатый фоновый вид.

2.) Интерактивный вид, который можно изменять и поворачивать.

3.) Наложение изображения с прозрачной частью.это представление начинает свою ось y с 128 и составляет 768x768.

4.) выше и ниже 3, это 2 вида 128 по высоте.

****** См. Пример фотографии ниже ****

Issue

В настоящее время я могу сохранить весь слой вида в библиотеке фотографий, используяПреобразования [[[self view] layer] renderInContext: и # 2 верны.Однако мне нужен способ сохранить 768x768 (например, зеленый лайм на фотографии) кадр, который включает только # 2 и # 3 включая преобразования # 2 .Если я использую [[#2 layer] renderInContext:, я получаю исходное изображение, и никаких преобразований. (см. Скриншот ниже для # ссылки.

Код

CGSize deviceSpec;
if ( IDIOM == IPAD ) { deviceSpec =CGSizeMake(768,768); } else { deviceSpec =CGSizeMake(320,480); }
if (  scale > 1.5  ) {
    UIGraphicsBeginImageContextWithOptions(deviceSpec, NO, scale);
} else {
    UIGraphicsBeginImageContext( deviceSpec );
}        

    CGContextRef ctx = UIGraphicsGetCurrentContext();      

    [[stripedBg layer] renderInContext:ctx];  //#1    

        CGContextSaveGState(ctx);

            CGContextConcatCTM(ctx, [[interactiveImage layer] affineTransform]);

            //CGContextTranslateCTM(ctx, interactiveImage.frame.origin.x,interactiveImage.frame.origin.y-128);

            [[interactiveImage layer] renderInContext:ctx]; // #2

        CGContextRestoreGState(ctx);

    [[overlayImage layer] renderInContext:ctx]; // #3

    UIImage * draft = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

Пример фотографии

Мне нужна только часть изображения, которая обведена LIME GREEN при сохранении преобразований пользователем.

enter image description here

1 Ответ

17 голосов
/ 08 сентября 2011

Если я правильно вас понимаю, проблема в том, что вы хотите визуализировать только слой №2, но слой №2 имеет преобразования, которые не сохраняются при визуализации только этого слоя? Вы можете применить эти преобразования к CTM (текущая матрица преобразования) графического контекста, прежде чем рендерить слой в этот контекст. Примерно так должно работать:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CGContextConcatCTM(ctx, [layer2 affineTransform]);
[layer2 renderInContext:ctx];
CGContextRestoreGState(ctx);

Обратите внимание, что вызовы CGContextSaveGState() и CGContextRestoreGState() необходимы только в том случае, если вы хотите нарисовать больше материала в контексте после рисования слоя. Вы можете опустить их, если слой все, что вы хотите.

...