我有一个项目,我正在使用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
并作为附件邮寄出去。谢谢。
更新:我按照建议将代码的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
。我如何得到整个图像呢?我认为基于UIImage
设置width
和height
变量可以做到这一点。
1条答案
按热度按时间yzuktlbb1#
这应该是注解,但不管怎样。
UIGraphicsBeginPDFContextToData()
函数不是要接受NSMutableData对象吗?该对象将成为渲染PDF的输出。另外,渲染图层不是一个好主意,我建议使用类似以下的方法渲染图像:在您的代码中,您请求绘制视图的层,我假设它不只是包含图像。如果您用上面的代码片段替换代码中的
self.view.layer.renderInContext(context!)
部分,上面的代码片段请求在PDF上下文中绘制图像。请查看Apple文档。
编辑:
所以我创建了一个小的测试项目,看看我是否可以让事情为我自己工作。我会给你看代码,然后告诉你几点你做错了。
1.你在这里并没有真正出错,我个人会使用一个可选的绑定。看看这个。使用这个的好处是你可以向用户报告错误(而不是让你的应用程序崩溃)。
1.这将解决你的大小问题。在你的代码中,你使用了
self.scannedPhoto.bounds
,它将返回UIImageView
的大小。在视网膜屏幕上,这实际上可能是原始图像的两倍,这可能会导致你的大小问题。传递UIImage
的实际大小对我来说也没有造成任何问题。1.您需要为要记录的PDF操作创建一些内存。
UIBeginPDFContextToData()
的文档声明这是一个输出参数。我告诉NSMutableData
为它提供现有图像数据的容量,但实际上,PDF上下文的大小可能会有所不同。您的代码的问题是您用PDF数据覆盖了imageData-这可能是预期的,也可能不是预期的。