Как создать CGBitmapContext, который работает для дисплея Retina и не тратит место на обычный дисплей?

Правда ли, что если это в UIKit, включая drawRect, HD-аспект дисплея Retina автоматически обрабатывается? Значит ли это, что в drawRectтекущий графический контекст для представления 1024 x 768 на самом деле является контекстом растрового изображения 2048 x 1536 пикселей?

( Обновление: если я создаю изображение с использованием текущего контекста в drawRectи печатаю его размер:

CGContextRef context = UIGraphicsGetCurrentContext();
CGImageRef image = CGBitmapContextCreateImage(context);
NSLog(@"width of context %i", (int) CGImageGetWidth(image));
NSLog(@"height of context %i", (int) CGImageGetHeight(image));

, то на новом iPad с отключенной строкой состояния 2048 и печатается 1536, а iPad 2 показывает 1024 и 768)

На самом деле мы наслаждаемся роскошью: 1 точка = 4 пикселя, которые автоматически обрабатываются для нас.

Однако, если мы используем CGBitmapContextCreate, то это действительно будут пиксели, а не точки? (по крайней мере, если мы предоставляем буфер данных для этого растрового изображения, размер буфера (количество байтов), очевидно, не для более высокого разрешения, а для стандартного разрешения, и даже если мы передаем NULLв качестве буфера так что CGBitmapContextCreateобрабатывает буфер для нас, размер, вероятно, такой же, как если бы мы передавали буфер данных, и это просто стандартное разрешение, а не разрешение Retina).

Мы всегда можем создать разрешение 2048 x 1536 для iPad 1 и iPad 2, а также для нового iPad, но это приведет к пустой трате памяти, мощности процессора и графического процессора, поскольку оно необходимо только для нового iPad.

Нужно ли нам использовать if () { } else { }для создания такого растрового контекста и как мы это делаем? И весь наш код CGContextMoveToPointдолжен быть скорректирован для дисплея Retina, чтобы использовать x * 2и y * 2по сравнению с дисплеем без сетчатки, использующим только х, утоже? Это может быть довольно грязным для кода. (или, может быть, мы можем определить локальную переменную scaleFactorи установить для нее значение [[UIScreen mainScreen] scale], чтобы она была равна 1 для стандартного разрешения и 2 для сетчатки, поэтому наш xи yвсегда будут x * scaleFactor, y * scaleFactorвместо просто xи yкогда мы рисуем с помощью CGContextMoveToPointи т.д.)

Кажется, что UIGraphicsBeginImageContextWithOptionsможет автоматически создать один для Retina, если передается масштаб 0,0, но я не не думаю, что его можно использовать, если мне нужно создать контекст и сохранить его (и использовать ivar или свойство UIViewController для его хранения). Если я не выпущу его с помощью UIGraphicsEndImageContext, то он останется в стеке графического контекста, поэтому вместо этого мне придется использовать CGBitmapContextCreate.(или мы просто оставляем его внизу стека и не беспокоимся об этом?)

15
задан nopole 3 June 2012 в 06:20
поделиться