2015-10-29 59 views
3

我创建了一些代码来在UIImage上下文中创建UIBezierPath。然后拍摄图像并创建一个base64字符串。我相信我应该在UIImage的开头和结尾画出路径。但是在很多小时后,它不能正常工作。我将base64字符串复制到网站以下载图像以查看它是否可用。我正在写这个在操场上:绘制UIBezierPath到UIImage到Base64图像不在Swift中工作

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

创建图像或转换为Base64时出现问题吗?这是两个完全无关的操作。将PNG数据保存到文件中,并查看是否可以打开该图像文件。如果是这样,问题出在您的Base64转换。另外,加载一些预先存在的图像并使用* that *作为Base64代码的输入 - 会发生什么? – Caleb

+0

@Caleb我刚刚测试了从URL加载,它的工作。这是我的'UIBezierPath',不知怎的,它很时髦。 – Johnston

回答

2

看起来好像你在做坏事。例如:

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

你为什么让你image画什么到图形上下文之前?我认为你会得到一张空白的图像 - 它不像你在一开始就得到的图像会随着你在上下文中绘制的东西而改变。等到您完成所有绘图之后才能看到图像。此外,该功能的文档说:

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

因此,请确保您已经满足这一要求,并且你回来当你调用UIGraphicsBeginImageContext()图像不nil

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

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

但为了这条道路真正在上下文得出,你必须做一些事情,绘制,如调用path.fill()path.stroke()。我在任何地方都看不到,所以即使你解决了上面的第一个问题,你仍然会得到一个空的图像,直到你做了一些绘图。

+0

你是完全正确的这个作品100%。我在创建形状路径并调用'path.stroke()'使其运动之后,需要调用'UIGraphicsGetImageFromCurrentImageContext()'。 – Johnston

0

您需要直接使用图像上下文。您可以尝试创建CGContextRef与像当前的图像内容:

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

然后直接添加您的路径设置为:

CGContextAddPath(context, path) 

或者您可以创建具有上下文的方法,如CGContextAddCurveToPoint,然后用描边路径曲线:

CGContextStrokePath(context) 

而且最后一个动作,从它创建图像:

let image = UIGraphicsGetImageFromCurrentImageContext() 
0

还有一点除了@Caleb: -

如果您正在绘制image.png其中1000×1000像素然后UIGraphicsBeginImageContext结果参数必须为一个以上的不同: -

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

enter image description here

Reference

相关问题