【问题标题】:Saving a photo and using it immediately保存照片并立即使用
【发布时间】:2015-09-02 11:25:42
【问题描述】:

我有以下代码用于拍摄照片并将其保存到相机胶卷。我需要能够在那里使用它,然后在保存后无需返回画廊并选择它。

我还没有找到任何关于如何做到这一点的示例。

    @IBOutlet weak var imagePicked: UIImageView!

    @IBAction func CameraBtn(sender: UIButton) {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera) {
            var imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.Camera;
            imagePicker.allowsEditing = false
            self.presentViewController(imagePicker, animated: true, completion: nil)
            cameraBool = true
        }
    }

    @IBAction func GalleryBtn(sender: UIButton) {
        println("gallery button clicked")
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) {
            var imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
            imagePicker.allowsEditing = true
            self.presentViewController(imagePicker, animated: true, completion: nil)
            cameraBool = false
        }
    }

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
        imagePicked.image = image
        if (cameraBool){
            var imageData = UIImageJPEGRepresentation(imagePicked.image, 0.6)
            var compressedJPGImage = UIImage(data: imageData)
            UIImageWriteToSavedPhotosAlbum(compressedJPGImage, nil, nil, nil)

        }
        self.dismissViewControllerAnimated(true, completion: nil);
    }

我需要能够在以下网络服务功能中使用这个保存的图像:

func urlRequestWithComponents(urlString:String, parameters:Dictionary<String, String>, imageData:NSData) -> (URLRequestConvertible, NSData) {

        // create url request to send
        var mutableURLRequest = NSMutableURLRequest(URL: NSURL(string: urlString)!)
        mutableURLRequest.HTTPMethod = Alamofire.Method.POST.rawValue
        let boundaryConstant = "myRandomBoundary12345";
        let contentType = "multipart/form-data;boundary="+boundaryConstant
        mutableURLRequest.setValue(contentType, forHTTPHeaderField: "Content-Type")



        // create upload data to send
        let uploadData = NSMutableData()

        // add image
        uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Disposition: form-data; name=\"file\"; filename=\"file.png\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData("Content-Type: image/png\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
        uploadData.appendData(imageData)

        // add parameters
        for (key, value) in parameters {
            uploadData.appendData("\r\n--\(boundaryConstant)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)
            uploadData.appendData("Content-Disposition: form-data; name=\"\(key)\"\r\n\r\n\(value)".dataUsingEncoding(NSUTF8StringEncoding)!)
        }
        uploadData.appendData("\r\n--\(boundaryConstant)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!)



        // return URLRequestConvertible and NSData
        return (Alamofire.ParameterEncoding.URL.encode(mutableURLRequest, parameters: nil).0, uploadData)
    }

当我从图库中选择一张图片并将其放置在屏幕上的 imageView 中时,我的 Web 服务正在运行。但是当我拍照时,我需要先将它保存到我现在已经完成的库中,但我缺少的是如何以编程方式从库中引用这张新创建的照片。

更新: 我假设从下面的相机块中检索到的从 nsurl 转换为 nsdata 如下所示。注意当用户选择拍照选项时,cameraBool 设置为 true。 ImageChanged 在 imagePickerController 函数中设置

if (imageChanged){
        //changed from placeholder
            if (!cameraBool){
                //retrieved from gallery
                let image = pic
                let imageData = UIImagePNGRepresentation(image)
            }
            else{
                //retrieved from camera
                let imageData = NSData(contentsOfURL: cameraPath)
            }
        }
        else{
            //upload nil
            let imageData = nil
        }

我的问题是图像的路径仅在我的 imagePickerController 函数中定义。所以我需要在文件顶部声明 cameraPath 以便它可以在 imagePickerController 函数中使用,然后在我的上传 web 服务中使用。看来我无法将 cameraPath 初始化为 nil。所以不知道怎么初始化?

var cameraPath : NSURL = nil
//not allowed

当我有的时候:

var cameraPath : NSURL

我收到我的控制器没有初始化程序的错误

【问题讨论】:

  • 你可以这样做:var cameraPath : NSURL?

标签: ios swift camera photo alamofire


【解决方案1】:

您可以通过这种方式获取最近添加的图像的路径:

func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [NSObject : AnyObject]!) {
    imagePicked.image = image
   if (cameraBool){
        var imageData = UIImageJPEGRepresentation(imagePicked.image, 0.6)
        var compressedJPGImage = UIImage(data: imageData)
        ALAssetsLibrary().writeImageToSavedPhotosAlbum(compressedJPGImage!.CGImage, orientation: ALAssetOrientation(rawValue: compressedJPGImage!.imageOrientation.rawValue)!,
        completionBlock:{ (path:NSURL!, error:NSError!) -> Void in
            println("\(path)")  //Here you will get your path
        })
    }
    self.dismissViewControllerAnimated(true, completion: nil);
}

会像这样打印路径:

assets-library://asset/asset.JPG?id=C5E0EB97-5D3D-41F9-8782-F48140144432&ext=JPG

【讨论】:

  • 我上传图片的函数需要一种 NSData,因为您的代码似乎给了我一个 NSURL,我将如何解决这个问题?我将添加上传到我的问题的功能
  • 所以你想用那个 URL 将该图像转换为 nsdata 吗?
  • var imageData = UIImageJPEGRepresentation(imagePicked.image, 0.6) 这是你的 imageData 不是吗?
【解决方案2】:

使用 ALAssetsLibrary,如果使用 UIImageWriteToSavedPhotosAlbum 保存图像,则不会获得指向它的指针。更多info.

编辑: 我认为@DharmeshKheni 的解决方案应该有效。我的猜测是您在设置之前阅读了 cameraPath。换句话说:我认为您在保存之前尝试使用新图片。你能说出cameraPath是在哪里设置的,你在哪里读到的吗?

【讨论】:

  • 我上传图片的函数需要一种 NSData,因为您的链接中的代码似乎给了我一个 NSURL,我将如何解决这个问题?我将添加上传到我的问题的功能
【解决方案3】:

您可以为此使用协议/委托模式。请参阅Apple Doc

基本上你在你的类中创建一个带有所需函数的协议,设置一个委托变量,然后将你的图像交给新的视图控制器。你可以找到教程here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多