我该如何通过编程方式创建UIImage?

27

这可能不是您最初想到的。我知道如何使用UIImage,但现在我需要知道如何使用以下内容创建一个“空白”UIImage:

CGRect screenRect = [self.view bounds];

好吧,就是那些尺寸。无论如何,我想知道如何创建一个以这些尺寸为基础、全白色的UIImage。这里没有实际的图片。

这是可能的吗?我确信是可能的,但也许我错了。

编辑

这需要是“白色”的图像,而不是“空白”的。 :)


好奇你需要一张空白图片干什么... - nielsbot
@nielsbot,我可以想象你会这样做。我会截取当前视图的屏幕截图,然后在滑动时进行动画处理。但是,有时如果内存被释放或者我进入历史记录并跳转到不同位置的项目,那么我将无法使用任何图像进行导航。我不想只是截取屏幕截图,因为它充满了错误的内容。因此,如果我检测到没有更多的屏幕截图,我会显示一个空白的屏幕截图。但是,当我的视图中没有任何内容时,我可能会拍摄一张照片。但我们会看看情况如何。 :) - Josiah
为什么不让您的查看器处理view == nil 的情况,而不是绘制任何内容呢?如果这是在UIView中,则可以使用view.backgroundColor = [UIColor whiteColor]; - nielsbot
@nielsbot,那将是我的备选计划。我真的只想找出是否没有图像,然后放入一张图片,这样动画就可以不变地工作。但如果我不能给我的空白上色,我想那就是我要做的了。 - Josiah
但无论哪种情况,它都应该能够正常工作...您有一个视图,可能有图像在其中,也可能没有...在任何情况下,您的视图动画都将是相同的。 - nielsbot
@nielsbot,没错,我最终基本上就是这样做了。感谢你的帮助! - Josiah
6个回答

39

您需要使用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()实际填充了这种颜色,并传递了一个填充画布的矩形。
然后,一个UIImage被创建出当前上下文,并关闭了上下文。因此,图像变量包含了所需大小的白色填充的UIImage

非常感谢。那就可以了。不幸的是,我刚刚使用了一个白色视图,但这仍然可能会有用! - Josiah

12

Swift 版本:

extension UIImage {

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

}

UIGraphicsGetImageFromCurrentImageContext() 返回可选的 UIImage - Orkhan Alikhanov
谢谢,很简短。我只需要将返回类型更改为UIImage? - AamirR

4
如果您想绘制一个空的图片,可以使用UIKit中的UIImageBeginImageContextWithOptions方法。
    UIGraphicsBeginImageContext(CGSizeMake(width, height));
    CGContextAddRect(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height)); // this may not be necessary
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

以上代码假设您绘制的图像大小为宽x高。它将矩形添加到图形上下文中,但这可能并非必要。请自行尝试。这是正确的方法。 :)

或者,如果您想创建当前视图的快照,您需要输入以下代码;

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

如果您使用图层,请不要忘记包含Quartz库。


谢谢,但目前这会创建一个透明图像。我需要图像为白色。你可以做到吗? - Josiah
谢谢 - 也许这是一个技巧, 但我在MKMapView上使用透明图像作为自定义MKAnnotation的Pin.Image。我的问题是我添加了自定义图像作为子视图(而不是设置pin image), 因此pin保持默认大小。通过添加与我的自定义子视图相同大小的透明图像,它能够正确地捕获整个子视图的点击事件。 - Timothy Lee Russell

2
根据@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.
}

以下是针对Swift 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
    }
}

1
使用最新的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
}

0

针对Xamarin.iOS的C#相同解决方案:

                UIGraphics.BeginImageContext(new CGSize(width, height));
                var image = UIGraphics.GetImageFromCurrentImageContext();
                UIGraphics.EndImageContext();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接