Получение и создание изображений

Большую часть времени это довольно прямо к изображениям на дисплее с помощью стандартных представлений. Однако существует две ситуации, в которых Вы, возможно, должны выполнить дополнительную работу:

Рисование изображений

Для максимальной производительности, если для Вашего рисования изображения нужно, может быть встречен с помощью 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 процедура следующие:

  1. Вызвать UIGraphicsBeginImageContextWithOptions создать растровый контекст и продвинуть его на графический штабель.

    Для первого параметра (size), передача a CGSize значение для указания размерностей растрового контекста (в точках).

    Для второго параметра (opaque), если Ваше изображение содержит прозрачность (альфа-канал), передача NO. Иначе, передача YES максимизировать производительность.

    Для заключительного параметра (scale), передача 0.0 для битового массива, масштабирующегося соответственно для основного экрана устройства или передающего масштабный коэффициент по Вашему выбору.

    Например, следующий фрагмент кода создает битовый массив, который составляет 200 x 200 пикселей. (Число пикселей определяется путем умножения размера изображения масштабным коэффициентом.)

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);
  2. Используйте UIKit или Базовые Графические подпрограммы для вовлечения содержания изображения в недавно создаваемый графический контекст.

  3. Вызовите UIGraphicsGetImageFromCurrentImageContext функция, чтобы генерировать и возвратить a UIImage основанный на объектах на том, что Вы нарисовали. При желании можно продолжать рисовать и вызвать этот метод снова для генерации дополнительных изображений.

  4. Вызвать 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 функция на графическом контексте.