Получение и создание изображений
Большую часть времени это довольно прямо к изображениям на дисплее с помощью стандартных представлений. Однако существует две ситуации, в которых Вы, возможно, должны выполнить дополнительную работу:
Если Вы хотите к изображениям на дисплее как часть пользовательского представления, необходимо нарисовать изображения сами в представлении
drawRect:
метод. Рисование Изображений объясняет как.Если Вы хотите представить изображения вне экрана (чтобы нарисовать позже или сохранить в файл), необходимо создать контекст растрового изображения. Для узнавания больше считайте Создающие Новые Изображения Используя Контексты Растрового изображения.
Рисование изображений
Для максимальной производительности, если для Вашего рисования изображения нужно, может быть встречен с помощью UIImageView
класс, необходимо использовать этот объект изображения для инициализации a UIImageView
объект. Однако, если необходимо нарисовать изображение явно, можно сохранить изображение и использовать его позже в представлении drawRect:
метод.
Следующий пример показывает, как загрузить изображение из пакета Вашего приложения.
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"myImage" ofType:@"png"]; |
UIImage *myImageObj = [[UIImage alloc] initWithContentsOfFile:imagePath]; |
// Store the image into a property of type UIImage * |
// for use later in the class's drawRect: method. |
self.anImage = myImageObj; |
Нарисовать получающееся изображение явно в Вашем представлении drawRect:
метод, можно использовать любой из методов рисования, доступных в UIImage
. Эти методы позволяют Вам указать, где в Вашем представлении Вы хотите нарисовать изображение и поэтому не требуете, чтобы Вы создали и применили отдельное преобразование до получения.
Следующий отрывок рисует изображение, загруженное выше в точке (10, 10) в представлении.
- (void)drawRect:(CGRect)rect |
{ |
... |
// Draw the image. |
[self.anImage drawAtPoint:CGPointMake(10, 10)]; |
} |
Создание новых изображений Используя контексты растрового изображения
Большую часть времени, при рисовании, цель состоит в том, чтобы показать что-то на экране. Однако иногда полезно нарисовать что-то к внеэкранному буферу. Например, Вы могли бы хотеть создать миниатюру существующего изображения, вовлечь буфер так, чтобы можно было сохранить его к файлу и т.д. Для поддержки тех потребностей можно создать контекст растрового изображения, использовать платформу UIKit или Базовые Графические функции, чтобы нарисовать к нему, и затем получить объект изображения из контекста.
В UIKit процедура следующие:
Вызвать
UIGraphicsBeginImageContextWithOptions
создать растровый контекст и продвинуть его на графический штабель.Для первого параметра (
size
), передача aCGSize
значение для указания размерностей растрового контекста (в точках).Для второго параметра (
opaque
), если Ваше изображение содержит прозрачность (альфа-канал), передачаNO
. Иначе, передачаYES
максимизировать производительность.Для заключительного параметра (
scale
), передача0.0
для битового массива, масштабирующегося соответственно для основного экрана устройства или передающего масштабный коэффициент по Вашему выбору.Например, следующий фрагмент кода создает битовый массив, который составляет 200 x 200 пикселей. (Число пикселей определяется путем умножения размера изображения масштабным коэффициентом.)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);
Используйте UIKit или Базовые Графические подпрограммы для вовлечения содержания изображения в недавно создаваемый графический контекст.
Вызовите
UIGraphicsGetImageFromCurrentImageContext
функция, чтобы генерировать и возвратить aUIImage
основанный на объектах на том, что Вы нарисовали. При желании можно продолжать рисовать и вызвать этот метод снова для генерации дополнительных изображений.Вызвать
UIGraphicsEndImageContext
выталкивать контекст от графического штабеля.
Метод в Перечислении 3-1 загрузил изображение по Интернету и вовлекает его в основанный на изображении контекст, уменьшенный масштаб до размера значка приложения. Это тогда получает a UIImage
объект, создаваемый из растровых данных и, присваивает его переменной экземпляра. Обратите внимание на то, что размер битового массива (первый параметр UIGraphicsBeginImageContextWithOptions
) и размер нарисованного содержания (размер imageRect
) должен соответствовать. Если содержание будет больше, чем битовый массив, то часть содержания будет отсечена и не появится в получающемся изображении.
Перечисление 3-1 , Получающее уменьшенное масштаб изображение к растровому контексту и получающее получающееся изображение
- (void)connectionDidFinishLoading:(NSURLConnection *)connection { |
UIImage *image = [[UIImage alloc] initWithData:self.activeDownload]; |
if (image != nil && image.size.width != kAppIconHeight && image.size.height != kAppIconHeight) { |
CGRect imageRect = CGRectMake(0.0, 0.0, kAppIconHeight, kAppIconHeight); |
UIGraphicsBeginImageContextWithOptions(itemSize, NO, [UIScreen mainScreen].scale); |
[image drawInRect:imageRect]; |
self.appRecord.appIcon = UIGraphicsGetImageFromCurrentImageContext(); // UIImage returned. |
UIGraphicsEndImageContext(); |
} else { |
self.appRecord.appIcon = image; |
} |
self.activeDownload = nil; |
[image release]; |
self.imageConnection = nil; |
[delegate appImageDidLoad:self.indexPathInTableView]; |
} |
Можно также вызвать Базовые Графические функции для рисования содержания сгенерированного растрового изображения; фрагмент кода в Перечислении 3-2, рисующем уменьшенное масштаб изображение страницы PDF, дает пример этого. Обратите внимание на то, что код зеркально отражает графический контекст до вызова CGContextDrawPDFPage
выровнять нарисованное изображение с системой координат по умолчанию UIKit.
Получение перечисления 3-2 к растровому контексту с помощью Базовых Графических функций
// Other code precedes... |
CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); |
pdfScale = self.frame.size.width/pageRect.size.width; |
pageRect.size = CGSizeMake(pageRect.size.width * pdfScale, pageRect.size.height * pdfScale); |
UIGraphicsBeginImageContextWithOptions(pageRect.size, YES, pdfScale); |
CGContextRef context = UIGraphicsGetCurrentContext(); |
// First fill the background with white. |
CGContextSetRGBFillColor(context, 1.0,1.0,1.0,1.0); |
CGContextFillRect(context,pageRect); |
CGContextSaveGState(context); |
// Flip the context so that the PDF page is rendered right side up |
CGContextTranslateCTM(context, 0.0, pageRect.size.height); |
CGContextScaleCTM(context, 1.0, -1.0); |
// Scale the context so that the PDF page is rendered at the |
// correct size for the zoom level. |
CGContextScaleCTM(context, pdfScale,pdfScale); |
CGContextDrawPDFPage(context, page); |
CGContextRestoreGState(context); |
UIImage *backgroundImage = UIGraphicsGetImageFromCurrentImageContext(); |
UIGraphicsEndImageContext(); |
backgroundImageView = [[UIImageView alloc] initWithImage:backgroundImage]; |
// Other code follows... |
Если Вы предпочитаете использовать Базовую Графику полностью для рисования в контексте растрового изображения, можно использовать CGBitmapContextCreate
функция, чтобы создать контекст и вовлечь Ваши содержимые изображения в него. Когда Вы закончите рисовать, вызовите CGBitmapContextCreateImage
функция для получения a CGImageRef
объект от растрового контекста. Можно составить Базовое Графическое изображение непосредственно или использовать это оно для инициализации a UIImage
объект. По окончании вызовите CGContextRelease
функция на графическом контексте.