Как сохранить изображение больше, чем разрешение устройства в iPhone?

Мой вопрос связан с этим ссылка

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

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

Благодарность!


person Rohan    schedule 03.02.2012    source источник


Ответы (1)


Не используйте 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 с дисплеем Retina — 2.0. Однако вы можете передать любой масштаб, какой хотите, поэтому, если вы передадите 5.0, каждая единица пикселя в вашем изображении будет фактически 5x5 пикселей в растровом изображении, точно так же, как 1 пиксель на дисплее Retina на самом деле 2x2 пикселя на экране.

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

person Nick Lockwood    schedule 03.02.2012
comment
Это не очень хорошее решение. UIGraphicsBeginImageContext и другие функции пользовательского интерфейса... не являются потокобезопасными, они выполняются в основном потоке. Когда вы используете эту функцию, пользовательский интерфейс вашего приложения зависает. - person Martin Pilch; 03.02.2012
comment
Кто сказал что-нибудь о нитях? В любом случае, если вам нужно использовать его в многопоточном контексте, вы всегда можете обернуть UIGraphicsBeginImageContext() в блок @synchronized и выполнить фактическое рисование, как только вы получите CGContextRef. - person Nick Lockwood; 03.02.2012
comment
@MartinPilch Тот факт, что все они работают в основном потоке, делает их потокобезопасными. Они вызываются только из одного потока - основного потока, поэтому потоки не входят в него. - person Abizern; 03.02.2012
comment
спс за повтор. Я использовал тот же код, но проблема в том, что когда я сохраняю изображение с большим разрешением, оно сохраняет изображение с разрешением устройства. и я хочу сохранить изображение с исходным разрешением. И UIGraphicsBeginImageContext(CGSizeMake(width, height), YES, 0.0f); дает ошибку слишком много аргументов.. - person Rohan; 04.02.2012
comment
Извините, должен был быть UIGraphicsBeginImageContextWithOptions - я обновил ответ. - person Nick Lockwood; 04.02.2012