Сохранение фотографии и ее немедленное использование

У меня есть следующий код для фотографирования и сохранения его в фотопленку. Мне нужно иметь возможность использовать его тут же после сохранения, не возвращаясь в галерею и не выбирая его.

Я не нашел примеров того, как это сделать.

    @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)
    }

Мой веб-сервис работает, когда я выбираю изображение из галереи и помещаю его в свое изображение на экране. Но когда я делаю фотографию, мне нужно сначала сохранить ее в библиотеке, что я сейчас и сделал, но мне не хватает того, как программно сослаться на эту вновь созданную фотографию из библиотеки.

ОБНОВЛЕНИЕ: я предполагаю, что преобразование из 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, а затем в моей веб-службе загрузки. Кажется, я не могу инициализировать cameraPath как ноль. Так что я не уверен, как его инициализировать?

var cameraPath : NSURL = nil
//not allowed

Когда у меня просто есть:

var cameraPath : NSURL

Я получаю сообщение об ошибке, что мой контроллер не имеет инициализаторов


person user2363025    schedule 17.06.2015    source источник
comment
Вы можете сделать это следующим образом: var cameraPath : NSURL?   -  person Dharmesh Kheni    schedule 17.06.2015


Ответы (3)


Вы можете получить путь к недавно добавленному изображению камерой следующим образом:

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
person Dharmesh Kheni    schedule 17.06.2015
comment
Моя функция для загрузки изображения ожидает тип NSData, как мне обойти это, поскольку ваш код дает мне NSURL? Я добавлю свою функцию для загрузки на мой вопрос - person user2363025; 17.06.2015
comment
Итак, вы хотите преобразовать это изображение в nsdata с этим URL-адресом? - person Dharmesh Kheni; 17.06.2015
comment
var imageData = UIImageJPEGRepresentation(imagePicked.image, 0.6) Вот ваши imageData, не так ли? - person Dharmesh Kheni; 17.06.2015


Для этого вы можете использовать протоколы/шаблон делегирования. См. Документ Apple.

В основном вы создаете протокол в своем классе с требуемыми функциями, устанавливаете переменную делегата, а затем передаете свое изображение новому контроллеру представления. Учебное пособие можно найти здесь.

person heikomania    schedule 17.06.2015