【问题标题】:Drawing a UIBezierPath to UIImage to Base64 Image not working in Swift将 UIBezierPath 绘制到 UIImage 到 Base64 图像在 Swift 中不起作用
【发布时间】:2016-01-29 03:29:45
【问题描述】:

我创建了一些代码来在 UIImage 上下文中创建 UIBezierPath。然后获取图像并创建一个 base64 字符串。我相信我应该在UIImage 的开头和结尾绘制路径。但是,经过几个小时后,它无法正常工作。我正在将 base64 字符串复制到网站以下载图像以查看它是否有效。我在操场上写这个:

import Foundation
import UIKit


UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), false, 0.0)
let image = UIGraphicsGetImageFromCurrentImageContext()

UIColor.blackColor().setStroke()
let path = UIBezierPath()
path.lineWidth = 2
path.moveToPoint(CGPointMake(100, 0))

path.addLineToPoint(CGPointMake(200, 40))
path.addLineToPoint(CGPointMake(160, 140))
path.addLineToPoint(CGPointMake(40, 140))
path.addLineToPoint(CGPointMake(0, 40))
path.closePath()

UIGraphicsEndImageContext();
let data = UIImagePNGRepresentation(image)
let b64 = data?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
print(b64!)

我猜是因为我的视网膜显示结果的 PNG 是 1000x1000。图像本身是完全透明的,什么都看不见。我正在使用这个站点来解码 base64 并保存一个文件,我已经尝试了另外 2 个来查看它是否是该站点。 http://www.motobit.com/util/base64-decoder-encoder.asp

编辑 我刚刚尝试了以下代码,看看我的图像或贝塞尔曲线是否存在问题或保存到 bas64。这段代码效果很好。所以我认为这是我的贝塞尔曲线的问题。

import Foundation
import UIKit

let image = UIImage(data: NSData(contentsOfURL: NSURL(string: "http://i.imgur.com/crr4m48.jpg")!)!)!

let data = UIImagePNGRepresentation(image)
let b64 = data?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
print(b64!)

【问题讨论】:

  • 是创建图片的问题,还是转Base64的问题?这是两个完全不相关的操作。将 PNG 数据保存到文件中,看看是否可以打开该图像文件。如果是这样,问题在于您的 Base64 转换。此外,加载一些预先存在的图像并使用 that 作为 Base64 代码的输入——会发生什么?
  • @Caleb 我刚刚通过从 URL 加载进行了测试,它工作正常。这是我的UIBezierPath,不知何故很时髦。

标签: ios swift uiimage base64 cgpath


【解决方案1】:

除了@Caleb 还有一点:-

如果您正在绘制 1000x1000 像素 结果的 image.png,则 UIGraphicsBeginImageContext 参数必须与上述不同:-

    //Swift-3 Syntax
    UIGraphicsBeginImageContextWithOptions( CGSize(width:500, height:500 ), false , 2.0 )

Reference

【讨论】:

    【解决方案2】:

    您需要直接使用图像上下文。您可以尝试使用当前图像上下文创建CGContextRef,例如:

    UIGraphicsBeginImageContext(CGSizeMake(200, 200))
    var context: CGContextRef = UIGraphicsGetCurrentContext()
    

    然后直接把你的路径加进去:

    CGContextAddPath(context, path)
    

    或者您可以使用 CGContextAddCurveToPoint 之类的上下文方法创建曲线,然后使用以下方法绘制路径:

    CGContextStrokePath(context)
    

    以及从中创建图像的最后一个操作:

    let image = UIGraphicsGetImageFromCurrentImageContext()
    

    【讨论】:

      【解决方案3】:

      看起来你做事有问题。例如:

      UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), false, 0.0)
      let image = UIGraphicsGetImageFromCurrentImageContext()
      

      为什么在将任何内容绘制到图形上下文之前会得到image?我认为你会得到一个空图像——它不像你一开始得到的图像会随着你在上下文中绘制东西而改变。等到完成所有绘图后才能获取图像。此外,该功能的文档说:

      仅当基于位图的图形上下文是当前图形上下文时,才应调用此函数。如果当前上下文为 nil 或不是通过调用 UIGraphicsBeginImageContext 创建的,则此函数返回 nil。

      因此,请确保您已满足该要求,并且当您调用 UIGraphicsBeginImageContext() 时返回的图像不是 nil

      接下来,您将创建一个贝塞尔路径:

      let path = UIBezierPath()
      path.lineWidth = 2
      path.moveToPoint(CGPointMake(100, 0))
      path.addLineToPoint(CGPointMake(200, 40))
      //...
      

      但为了在您的上下文中实际绘制该路径,您必须执行一些绘制操作,例如调用path.fill()path.stroke()。我在任何地方都没有看到,所以即使你解决了上面的第一个问题,在你做一些绘图之前,你仍然会得到一个空图像。

      【讨论】:

      • 你是绝对正确的 这 100% 有效。在创建形状路径后,我需要调用 UIGraphicsGetImageFromCurrentImageContext() 并调用 path.stroke() 来启动它。
      猜你喜欢
      • 2015-05-21
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-21
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多