2015-10-29 26 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