2012-02-03 4 views
1

Мой вопрос связан с этой linkКак сохранить изображение, превышающее разрешение устройства в iPhone?

Я хотел бы знать, как мы можем сохранить изображения большего размера, чем разрешение устройства с использованием CGBitmapContextCreate.

Любой образец кода для руководства будет высоко оценен.

спасибо!

ответ

4

Не используйте 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 являются:

  1. Размер изображения - это может быть все, что вы хотите

  2. ли изображение имеет прозрачность или нет

  3. Шкала пикселей на изображении. 0.0 по умолчанию, поэтому на iPhone 3GS он будет 1.0 и на iPhone 4 с дисплеем сетчатки будет 2,0. Вы можете пройти в любом масштабе, который вам нужен, поэтому, если вы пройдете в 5.0, каждый пиксельный блок на вашем изображении будет фактически иметь 5x5 пикселей в растровом изображении, точно так же, как 1 пиксель на экране Retina действительно имеет 2x2 пикселя на экране.

Edit: оказывается, что вопрос о том, является ли UIGraphicsBeginImageContext() потокобезопасно, кажется, немного спорным. Если вам нужно сделать это одновременно на фоновом потоке, существует альтернативный (более сложный подход) с использованием CGBitMapContextCreate() здесь: UIGraphicsBeginImageContext vs CGBitmapContextCreate

+1

Это нехорошее решение. UIGraphicsBeginImageContext и другие функции UI ... не являются потокобезопасными, они работают на основном протекторе. Когда вы используете эту функцию, пользовательский интерфейс приложения будет заморожен. –

+0

Кто сказал что-нибудь о потоках? В любом случае, если вам нужно использовать его в поточном контексте, вы всегда можете перенести UIGraphicsBeginImageContext() в блок @synchronized и сделать свой фактический чертеж, как только у вас появится CGContextRef. –

+0

@MartinPilch Тот факт, что все они работают на основном потоке, делает их потокобезопасными. Они вызывается только из одного потока - ** основного потока **, поэтому в него не входит нить. – Abizern