【问题标题】:How can I make an UIImage programmatically?如何以编程方式制作 UIImage?
【发布时间】:2013-01-30 00:38:38
【问题描述】:

这可能不是您认为的开始。我知道如何使用 UIImage,但我现在需要知道如何使用以下方法创建“空白” UIImage:

CGRect screenRect = [self.view bounds];

嗯,那些尺寸。无论如何,我想知道如何创建一个 UIImage ,这些尺寸全是白色的。这里没有实际图片。

这甚至可能吗?我敢肯定,但也许我错了。

编辑

这必须是“白色”图像。不是空的。 :)

【问题讨论】:

  • 好奇你需要一张空白图片来做什么......
  • @nielsbot,我可以想象你会是这样。我确实截取了当前视图的屏幕截图,然后在滑动时对其进行动画处理。但是,有时如果内存被释放或者如果我进入历史并跳转到不同位置的项目,那么我将没有图像可以导航。我不只是想截图,因为它充满了不正确的内容。因此,如果我没有检测到更多的屏幕截图,我会显示一个空白的。但是,当我的视图中没有任何内容时,我可能最终会为我的视图拍照。但我们会看到的。 :)
  • 为什么不让您的查看器处理 view == nil 的情况而不绘制任何东西?如果这是在 UIView 中,您可以使用 view.backgroundColor = [ UIColor whiteColor ];
  • @nielsbot,这将是我的后备计划。我真的只是想找出是否没有图像,然后将图像放入,因此动画可以保持不变。但是,如果我不能给我的空白上色,我想这就是我会做的。
  • 但在任何一种情况下它的工作方式都应该是一样的......你有一个视图,里面可能有也可能没有图像......在任何一种情况下,你的视图动画都是一样的。跨度>

标签: objective-c cocoa-touch 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() 并传递一个填充画布的矩形,画布会立即被该颜色填充。

然后从当前上下文创建UIImage,并关闭上下文。因此,图像变量包含所需大小的UIImage,填充为白色。

【讨论】:

  • 你非常喜欢。这样就可以了。不幸的是,我只是继续使用白色视图,但这仍然可以派上用场!
【解决方案2】:

Swift 版本:

extension UIImage {

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

}

【讨论】:

【解决方案3】:

如果你只想绘制一个空图像,你可以使用 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 库。

【讨论】:

  • 谢谢,但目前正在创建透明图像。我需要将图像涂成白色。有没有办法做到这一点?
  • 谢谢 - 也许这是一个 hack,但我在 MKMapView 上的自定义 MKAnnotation 上使用透明图像作为 Pin.Image。我的问题是我将自定义图像添加为子视图(而不是设置图钉图像),因此图钉保持其默认大小。通过添加与我的自定义子视图大小相同的透明图像,它就能够正确捕捉整个子视图的点击。
【解决方案4】:

基于@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
    }
}

【讨论】:

    【解决方案5】:

    使用最新的 UIGraphics 类,并且在 swift 中,这看起来像这样(注意 user1834305 的答案中缺少 CGContextDrawPath,这是产生透明图像的原因):

    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
    }
    

    【讨论】:

      【解决方案6】:

      在 C# 中为 Xamarin.iOS 提供相同的解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-02
        • 2012-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-16
        相关资源
        最近更新 更多