2015-01-08 2 views
1

Этот вопрос убивает меня. Я не знаю, что происходит. Но следующий код превращает изображение вверх тормашками. Фактически это делает вертикальный флип, и я не знаю почему.CGContextRef => CGImageRef => CIImage => CGImageRef => Цепочка CGContextDrawImage переворачивает изображение вверх дном

UIFont *font = [UIFont fontWithName:fontName size:fontSize]; 

NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init]; 
[attributes setObject:font forKey:NSFontAttributeName]; 
[attributes setObject:[NSNumber numberWithFloat:kStrokeWidth] forKey:NSStrokeWidthAttributeName]; 
[attributes setObject:[UIColor redColor] forKey:NSStrokeColorAttributeName]; 
[attributes setObject:style forKey:NSParagraphStyleAttributeName]; 

[text drawInRect:drawRect withAttributes:attributes]; 

[attributes removeObjectForKey:NSStrokeWidthAttributeName]; 
[attributes removeObjectForKey:NSStrokeColorAttributeName]; 
[attributes setObject:[UIColor blueColor] forKey:NSForegroundColorAttributeName]; 
[text drawInRect:drawRect withAttributes:attributes]; 

CGImageRef cgImg = CGBitmapContextCreateImage(context); 
CIImage *beginImage = [CIImage imageWithCGImage:cgImg]; 

CIContext *cicontext = [CIContext contextWithOptions:nil]; 
CGImageRef cgimg = [cicontext createCGImage:beginImage fromRect:[beginImage extent]]; 
CGContextDrawImage(context, [beginImage extent] , cgimg); 
CGImageRelease(cgImg); 
CGImageRelease(cgimg); 


UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 

Это приведет к следующим образом:

enter image description here

Почему, ну почему?

+0

Возможно, вы потеряете поворот при создании контекста, в котором вызывается этот метод и почему вы создаете также CIContext – Andrea

+0

я создать CIContet оказать? CIImage возвращается в CGImageRef. О какой ротации вы говорите? – Teddy

ответ

2

Этот может быть более подходящим в качестве комментария, чем в качестве ответа, но слишком длинный для комментария.

Как заметил @Andrea, немного странно, что вы создаете CGContext и CIContext. Если вы просто хотите, чтобы извлечь UIImage из CGImageRef вы можете использовать

UIImage *newImage = [[UIImage alloc] initWithCGImage:cgImg] 

Образовавшееся newImage воли еще быть перевернуты. Системы координат, используемые UIImages и CGContextRefs, имеют противоположно ориентированные вертикальные оси. Я рекомендую, чтобы вы переключаете ваш первоначальный CGContextRef вертикально при рисовании:

CGContextSaveGState(context); 
CGContextTranslateCTM(context, 0, CGBitmapContextGetHeight(context)); 
CGContextScaleCTM(context, 1, -1); 
// All your drawing code goes here. 
CGContextRestoreGState(context); 
+0

Это хорошее объяснение спасибо. Я не знал об этой проблеме с координатами. Это может объяснить проблему. Тем не менее, я немного смущен, почему это не происходит в обоих направлениях (рендеринг и CIImage должен делать флип дважды). Причина преобразования изображения в CIImage заключается в применении фильтра размытия на тексте, который я сделал earleir для CGImage. – Teddy

+0

@ Тэдди Аарон прав, система координат в основной графике перевернута, потому что в iOS начало координат слева вверху, на Mac внизу слева и CG происходит от osx. В UIKit также появились API-интерфейсы, которые создают уже перевернутый CGContext. – Andrea

+0

Понял. Спасибо – Teddy

Смежные вопросы