将UIBezierPath绘制为UIImage到Base64图像无法在Swift

时间:2015-10-29 05:34:07

标签: ios swift uiimage base64 cgpath

我创建了一些代码,以便在UIBezierPath上下文中创建UIImage。然后拍摄图像并创建一个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

修改 我刚刚尝试了以下代码,以查看我的图像或bezier或保存到bas64的问题。这段代码效果很好。所以我认为这对我的bezier来说是一个问题。

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!)

3 个答案:

答案 0 :(得分:2)

看起来你正在做的事情不按规定。例如:

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()。我没有看到任何地方,所以即使你解决了上面的第一个问题,你仍然会得到一个空图像,直到你做一些绘图。

答案 1 :(得分:0)

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

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

然后直接添加你的路径:

CGContextAddPath(context, path)

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

创建描边路径
CGContextStrokePath(context)

从中创建图像的最后一个动作:

let image = UIGraphicsGetImageFromCurrentImageContext()

答案 2 :(得分:0)

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

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

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

enter image description here

Reference