用户拍摄的照片未使用 Swift 转换为 PDF 2
User taken photo not converting to PDF using Swift 2
我有一个项目正在使用 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
变量会做到这一点。
这真的应该是评论,但无论如何。 UIGraphicsBeginPDFContextToData()
函数不是要接受一个 NSMutableData 对象,它将成为呈现的 PDF 的输出吗?另外,渲染图层不是一个好主意,我建议使用这样的方式渲染图像:
UIGraphicsPushContext(context)
yourUIImage.drawAtPoint(CGPointZero)
UIGraphicsPopContext()
在您的代码中,您请求绘制视图的图层,我认为它不仅仅包含图像。如果您将代码中的 self.view.layer.renderInContext(context!)
部分替换为上面的代码片段,则上面的代码片段请求在您的 PDF 上下文中绘制图像。
编辑:
所以我创建了一个小测试项目,看看我是否可以让事情为我自己工作。我先把代码给你看,然后说出你错的几点。
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.
}
- 你在这里并没有真正出错,我个人会使用可选绑定。检查 this out。使用它的好处是您可以向用户报告出现问题的错误(而不是让您的应用程序崩溃)。
这将解决您的尺码问题。在您的代码中,您使用了 self.scannedPhoto.bounds
,这将 return UIImageView
的大小。在视网膜屏幕上,这实际上可能是原始图像大小的两倍,这可能会导致尺寸问题。传递 UIImage
的实际大小对我也没有造成任何问题。
您需要为要记录的 PDF 操作创建一些内存。UIBeginPDFContextToData()
的文档声明这是一个输出参数。我告诉 NSMutableData
给它现有图像数据的容量,但实际上,PDF 上下文的大小可能会有所不同。您的代码的问题是您用 PDF 数据覆盖了 imageData - 这可能是预期的,也可能不是预期的。
我有一个项目正在使用 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
变量会做到这一点。
这真的应该是评论,但无论如何。 UIGraphicsBeginPDFContextToData()
函数不是要接受一个 NSMutableData 对象,它将成为呈现的 PDF 的输出吗?另外,渲染图层不是一个好主意,我建议使用这样的方式渲染图像:
UIGraphicsPushContext(context)
yourUIImage.drawAtPoint(CGPointZero)
UIGraphicsPopContext()
在您的代码中,您请求绘制视图的图层,我认为它不仅仅包含图像。如果您将代码中的 self.view.layer.renderInContext(context!)
部分替换为上面的代码片段,则上面的代码片段请求在您的 PDF 上下文中绘制图像。
编辑:
所以我创建了一个小测试项目,看看我是否可以让事情为我自己工作。我先把代码给你看,然后说出你错的几点。
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.
}
- 你在这里并没有真正出错,我个人会使用可选绑定。检查 this out。使用它的好处是您可以向用户报告出现问题的错误(而不是让您的应用程序崩溃)。
这将解决您的尺码问题。在您的代码中,您使用了
self.scannedPhoto.bounds
,这将 returnUIImageView
的大小。在视网膜屏幕上,这实际上可能是原始图像大小的两倍,这可能会导致尺寸问题。传递UIImage
的实际大小对我也没有造成任何问题。您需要为要记录的 PDF 操作创建一些内存。
UIBeginPDFContextToData()
的文档声明这是一个输出参数。我告诉NSMutableData
给它现有图像数据的容量,但实际上,PDF 上下文的大小可能会有所不同。您的代码的问题是您用 PDF 数据覆盖了 imageData - 这可能是预期的,也可能不是预期的。