我有一个使用Xcode7和Swift 2的项目。我有一个ViewController,允许用户用他们的设备相机拍照。然后,它将拍摄的照片加载到UIImageView中,他们可以将照片作为PDF发送出去。
为了拍照,我有一个UIBarButtonItem,它的Action代码是:
@IBAction func takeScan(sender: UIBarButtonItem) {
var image = UIImagePickerController()
image.delegate = self
image.sourceType = UIImagePickerControllerSourceType.Camera
image.allowsEditing = false
self.presentViewController(image, animated: true, completion: nil)
}我也有代码来说明之后的图像发生了什么:
func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
// Dismiss imagePickerController
self.dismissViewControllerAnimated(true, completion: nil)
// Set the View Controller image to taken photo
scannedPhoto.image = image
}我有一个UIButton作为PDF附件发送照片。它提示用户键入PDF文件的名称,并将该名称保存到variable中。
let nameText = nameSaveAlert.textFields![0]
// AUTO CAPITALIZE Input Alert Text
// Create a String
var textConvert = ""
// Set string to inputed text from user
textConvert = nameText.text!
// Creat NSString that takes the above string and capitalizes it
let capsWord: NSString = textConvert.capitalizedString
// Assign the capitalized name to variable for use
let pdfFileName = capsWord as String
// Convert image to data to be saved using JPG data and 90%
let imageData = UIImageJPEGRepresentation(self.scannedRecipe.image!, 0.9)
// PDF Work
let pdfWidth = self.scannedPhoto.bounds.width
let pdfHeight = self.scannedPhoto.bounds.height
let pdfData = imageData as! NSMutableData
UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: 0, y: 0, width: pdfWidth, height: pdfHeight), nil)
let context = UIGraphicsGetCurrentContext()
UIGraphicsBeginPDFPage()
self.view.layer.renderInContext(context!)
UIGraphicsEndPDFContext()然后打开邮件应用程序并创建一个带有PDF作为附件的电子邮件。我可以把它送出去。问题是,它似乎是用UIImage的尺寸截图,并将该图像保存为PDF,而不是使用用户所拍摄的实际图像。为什么?我的目标是将用户拍照并转换为PDF,并将其作为附件发送出去。谢谢。
Update:我将代码的PDF部分更改为如下所示:
let pdfWidth = self.scannedPhoto.bounds.width
let pdfHeight = self.scannedPhoto.bounds.height
let pdfData = imageData as! NSMutableData
UIGraphicsBeginPDFContextToData(pdfData, CGRect(x: 0, y: 0, width: pdfWidth, height: pdfHeight), nil)
let context = UIGraphicsGetCurrentContext()
// Convert scannedPhoto to a type UIImage
var imageConvert = self. scannedPhoto.image! as UIImage
UIGraphicsBeginPDFPage()
UIGraphicsPushContext(context!)
imageConvert.drawAtPoint(CGPointZero)
UIGraphicsPopContext()
UIGraphicsEndPDFContext()新的问题是,我现在只有一个小左角的图像作为一个PDF。我怎么弄清楚整个情况?我认为基于width设置height和UIImage变量可以做到这一点。
发布于 2016-01-26 20:18:19
这真的应该是评论,但无论如何。UIGraphicsBeginPDFContextToData()函数不是要接受一个NSMutableData对象,它将成为呈现的PDF的输出吗?另外,渲染图层也不是一个好主意,我建议使用这样的方法来呈现图像:
UIGraphicsPushContext(context)
yourUIImage.drawAtPoint(CGPointZero)
UIGraphicsPopContext()在您的代码中,您请求绘制视图的层,我假定该层不只是包含图像。上面的代码片段请求在PDF上下文中绘制图像,如果您用上面的代码片段替换代码中的self.view.layer.renderInContext(context!)部件的话。
看一看苹果文档。
编辑:
因此,我创建了一个小测试项目,看看我是否能让事情为自己工作。我会给你看代码,然后给出你出错的几点。
if let image: UIImage = self.scannedPhoto.image, // 1.
let imageData = UIImageJPEGRepresentation(image, 0.9) {
let pdfSize = image.size // 2.
let pdfData = NSMutableData(capacity: imageData.length)! // 3.
UIGraphicsBeginPDFContextToData(pdfData, CGRect(origin: CGPoint(), size: pdfSize), nil)
let context = UIGraphicsGetCurrentContext()!
UIGraphicsBeginPDFPage()
// required so the UIImage can render into our context
UIGraphicsPushContext(context)
image.drawAtPoint(CGPoint())
UIGraphicsPopContext()
UIGraphicsEndPDFContext()
// now pdfData contains the rendered image.
}self.scannedPhoto.bounds,它将返回UIImageView的大小。在视网膜屏幕上,这可能是原来图像的两倍大,这可能会导致你的尺寸问题。传递UIImage的实际大小对我也没有造成任何问题。UIBeginPDFContextToData()的docs声明这是一个输出参数。我告诉NSMutableData给它现有图像数据的容量,但是在现实中,PDF上下文的大小可能会有所不同。代码的问题是用PDF数据覆盖imageData --这可能是预期的,也可能不是预期的。https://stackoverflow.com/questions/35017494
复制相似问题