如何创建一个黑色的UIImage?

9

我到处查找,但找不到实现这个的方法。我需要创建一个指定宽度和高度的黑色UIImage(宽度和高度会更改,所以我不能只创建一个黑色方框然后将其加载到UIImage中)。是否有一种方法可以创建CGRect然后将其转换为UIImage?或者是否还有其他方法可以创建一个简单的黑色框?


1
如果你只需要一个黑盒子,可以使用你的CGRect创建一个UIView,将backgroundColor设置为[UIColor blackColor],然后将这个新的UIView添加到你现有的视图中(例如从控制器中的self.view),使用addSubview - Rob
密切相关:对于大块颜色,UIView和UIImage哪个更便宜? 另请参阅:在UIImage上叠加颜色,其中有一个答案告诉您如何做您所要求的事情。 - jscs
5个回答

25
根据你的情况,你可能只需使用一个背景颜色设置为[UIColor blackColor]的UIView。此外,如果图像是单色的,则不需要实际尺寸与所需显示尺寸相同的图像;您可以将1x1像素图像缩放以填充必要的空间(例如,通过将UIImageView的contentMode设置为UIViewContentModeScaleToFill)。
话虽如此,了解如何生成这样的图像可能很有帮助:
Objective-C
CGSize imageSize = CGSizeMake(64, 64);
UIColor *fillColor = [UIColor blackColor];
UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
[fillColor setFill];
CGContextFillRect(context, CGRectMake(0, 0, imageSize.width, imageSize.height));
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Swift

let imageSize = CGSize(width: 420, height: 120)
let color: UIColor = .black
UIGraphicsBeginImageContextWithOptions(imageSize, true, 0)
let context = UIGraphicsGetCurrentContext()!
color.setFill()
context.fill(CGRect(x: 0, y: 0, width: imageSize.width, height: imageSize.height))
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()

6
UIGraphicsBeginImageContextWithOptions(CGSizeMake(w,h), NO, 0);
UIBezierPath* p =
    [UIBezierPath bezierPathWithRect:CGRectMake(0,0,w,h)];
[[UIColor blackColor] setFill];
[p fill];
UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

现在im是图片。
该代码几乎没有改变,来自我书中的这一部分:http://www.apeth.com/iOSBook/ch15.html#_graphics_contexts

完美。唯一需要更改的是,由于我们可能会在上下文中绘制不透明颜色,因此可以将“opaque”设置为“YES”。 - warrenm
实际上,如果您将opaque设置为YES,我认为您甚至不需要绘制黑色填充的矩形! :) 不透明的图形上下文黑色的。 - matt
不错的发现。我想知道这是否有记录,还是只是一种实现上的怪癖。 - warrenm
这在我的书中有记录,所以我希望它不是一个实现上的怪异之处! - matt

3

Swift 3:

func uiImage(from color:UIColor?, size:CGSize) -> UIImage? {

    UIGraphicsBeginImageContextWithOptions(size, true, 0)
    defer {
        UIGraphicsEndImageContext()
    }

    let context = UIGraphicsGetCurrentContext()
    color?.setFill()
    context?.fill(CGRect.init(x: 0, y: 0, width: size.width, height: size.height))
    return UIGraphicsGetImageFromCurrentImageContext()
}

2

像这样

let image = UIGraphicsImageRenderer(size: bounds.size).image { _ in
      UIColor.black.setFill()
      UIRectFill(bounds)
}

正如WWDC视频中所引用的:

还有一个更旧的功能,叫做UIGraphicsBeginImageContext。但是请不要使用它。


0
下面是一个示例,它创建了一个1920x1080的黑色UIImage,通过从创建的CIImage创建的CGImage创建它:
let frame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 1920, height: 1080))
let cgImage = CIContext().createCGImage(CIImage(color: .black()), from: frame)!
let uiImage = UIImage(cgImage: cgImage)

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