Не используйте CGBitmapContextCreate, используйте UIGraphicsBeginImageContextWithOptions, это намного проще. Используйте его так:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), YES, 1.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
//do your drawing
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEdnImageContext();
//your resultant UIImage is now stored in image variable
Три параметры UIGraphicsBeginImageContext являются:
Размер изображения - это может быть все, что вы хотите
ли изображение имеет прозрачность или нет
Шкала пикселей на изображении. 0.0 по умолчанию, поэтому на iPhone 3GS он будет 1.0 и на iPhone 4 с дисплеем сетчатки будет 2,0. Вы можете пройти в любом масштабе, который вам нужен, поэтому, если вы пройдете в 5.0, каждый пиксельный блок на вашем изображении будет фактически иметь 5x5 пикселей в растровом изображении, точно так же, как 1 пиксель на экране Retina действительно имеет 2x2 пикселя на экране.
Edit: оказывается, что вопрос о том, является ли UIGraphicsBeginImageContext() потокобезопасно, кажется, немного спорным. Если вам нужно сделать это одновременно на фоновом потоке, существует альтернативный (более сложный подход) с использованием CGBitMapContextCreate() здесь: UIGraphicsBeginImageContext vs CGBitmapContextCreate
Это нехорошее решение. UIGraphicsBeginImageContext и другие функции UI ... не являются потокобезопасными, они работают на основном протекторе. Когда вы используете эту функцию, пользовательский интерфейс приложения будет заморожен. –
Кто сказал что-нибудь о потоках? В любом случае, если вам нужно использовать его в поточном контексте, вы всегда можете перенести UIGraphicsBeginImageContext() в блок @synchronized и сделать свой фактический чертеж, как только у вас появится CGContextRef. –
@MartinPilch Тот факт, что все они работают на основном потоке, делает их потокобезопасными. Они вызывается только из одного потока - ** основного потока **, поэтому в него не входит нить. – Abizern