将 UIBezierPath 绘制到 UIImage 到 Base64 图像在 Swift 中不起作用

Drawing a UIBezierPath to UIImage to Base64 Image not working in Swift

我创建了一些代码以在 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!)

看起来你做事不按顺序进行。例如:

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

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

You should call this function only when a bitmap-based graphics context is the current graphics context. If the current context is nil or was not created by a call to UIGraphicsBeginImageContext, this function returns nil.

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

接下来,您将创建贝塞尔曲线路径:

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

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

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

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

然后直接加上你的路径:

CGContextAddPath(context, path)

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

CGContextStrokePath(context)

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

let image = UIGraphicsGetImageFromCurrentImageContext()

除了@Caleb 之外还有一点:-

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

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

Reference