2015-10-29 2 views
3

Я создал код для создания UIBezierPath в контексте UIImage. Затем возьмите изображение и создайте строку 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

EDIT Я просто попытался следующий код, чтобы увидеть, если вопрос с моим изображением или Безье или сохранения в 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. Кроме того, загрузите какое-то ранее существующее изображение и используйте *, который * в качестве входа в ваш код 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%. Мне нужно было вызвать 'UIGraphicsGetImageFromCurrentImageContext()' после того, как я создаю путь формы и вызываю 'path.stroke()', чтобы привести эту вещь в движение. – Johnston

0

Вам необходимо напрямую работать с контекстом изображения.Вы можете попробовать создать CGContextRef с текущим контекстом изображения как:

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

А затем непосредственно добавить свой путь к нему:

CGContextAddPath(context, path) 

Или вы можете создать вам кривые с помощью методов контекстных как CGContextAddCurveToPoint, а затем пути тактный :

CGContextStrokePath(context) 

И последнее действие, чтобы создать изображение из него:

let image = UIGraphicsGetImageFromCurrentImageContext() 
0

еще один пункт в дополнение к @Caleb: -

Если вы рисуете image.png который результат 1000x1000 пикселей затем UIGraphicsBeginImageContext параметр должен отличаться, как описано выше: один -

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

enter image description here

Reference

Смежные вопросы