Как я могу сделать UIImage программно?

Это не то, что вы, вероятно, думали, что это должно начаться. Я знаю, как использовать UIImage, но теперь мне нужно знать, как создать "пустой" UIImage, используя:

CGRect screenRect = [self.view bounds];

Ну, эти размеры. Во всяком случае, я хочу знать, как я могу создать UIImage с теми размерами, которые окрашены в белый цвет. Нет фактических изображений здесь.

Возможно ли это? Я уверен, что это так, но, возможно, я ошибаюсь.

Изменить

Это должно быть "белое" изображение. Не пустой.:)

Ответ 1

Вам нужно использовать CoreGraphics, как показано ниже.

CGSize size = CGSizeMake(desiredWidth, desiredHeight);
UIGraphicsBeginImageContextWithOptions(size, YES, 0);
[[UIColor whiteColor] setFill];
UIRectFill(CGRectMake(0, 0, size.width, size.height));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Код создает новый контекст изображения CoreGraphics с параметрами, переданными как параметры; размера, непрозрачности и масштаба. Пропустив 0 для масштабирования, iOS автоматически выбирает соответствующее значение для текущего устройства.

Затем цвет контекстного заливки устанавливается на [UIColor whiteColor]. Сразу же холст фактически заполняется этим цветом, используя UIRectFill() и пропуская прямоугольник, который заполняет холст.

A UIImage затем создается из текущего контекста, и контекст закрывается. Поэтому переменная изображения содержит UIImage нужного размера, заполненную белым.

Ответ 2

Если вы хотите нарисовать только пустое изображение, вы можете использовать метод UIKit UIImageBeginImageContextWithOptions:.

    UIGraphicsBeginImageContext(CGSizeMake(width, height));
    CGContextAddRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height)); // this may not be necessary
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

В приведенном выше коде предполагается, что вы рисуете изображение с размером width x height. Он добавляет прямоугольник в графический контекст, но он может и не понадобиться. Попробуй сам. Это путь.:)

Или, если вы хотите создать моментальный снимок вашего текущего вида, введите код, например:

 UIGraphicsBeginImageContext(CGSizeMake(self.view.size.width, self.view.size.height));
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

Не забудьте включить библиотеку Quartz, если вы используете слой.

Ответ 3

Быстрая версия:

extension UIImage {

    static func emptyImageWithSize(size: CGSize) -> UIImage {
        UIGraphicsBeginImageContext(size)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }

}

Ответ 4

Используя последние классы UIGraphics и в swift, это выглядит так (обратите внимание на CGContextDrawPath, отсутствующий в ответе от user1834305, это причина, по которой создается прозрачное изображение):

static func imageWithSize(size : CGSize, color : UIColor) -> UIImage {
    UIGraphicsBeginImageContext(size)
    let context = UIGraphicsGetCurrentContext()
    CGContextSetFillColorWithColor(context, color.CGColor)
    CGContextAddRect(context, CGRect(x: 0, y: 0, width: size.width, height: size.height));
    CGContextDrawPath(context, .Fill)
    let image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image
}

Ответ 5

На основании ответов @HixField и @Rudolf Adamkovič. здесь расширение, которое возвращает необязательный, который, я считаю, правильный способ сделать это (исправьте меня, если я ошибаюсь!)?

Это расширение позволяет вам создать пустую UIImage того, что вам нужно (до предела памяти), с тем, что вы хотите заполнить цветом, который по умолчанию является белым, если вы хотите, чтобы изображение было четким цветом, используйте что-то вроде следующего:

let size = CGSize(width: 32.0, height: 32.0)
if var image = UIImage.imageWithSize(size:size, UIColor.clear) {
    //image was successfully created, do additional stuff with it here.
}

Это для быстрого 3.x:

extension UIImage {
     static func imageWithSize(size : CGSize, color : UIColor = UIColor.white) -> UIImage? {
         var image:UIImage? = nil
         UIGraphicsBeginImageContext(size)
         if let context = UIGraphicsGetCurrentContext() {
               context.setFillColor(color.cgColor)
               context.addRect(CGRect(origin: CGPoint.zero, size: size));
               context.drawPath(using: .fill)
               image = UIGraphicsGetImageFromCurrentImageContext();
        }
        UIGraphicsEndImageContext()
        return image
    }
}