1

i'm using the UIImagePickerController to take photo and im converting image to base64 and i want to send image to my server but the photo was converting to base64 but the problem is i can't send the converted photo to my server in paramenter

here my code

@IBOutlet weak var CameraOutlet: UIButton!
@IBOutlet weak var Complaint_Image1: UIImageView!
@IBOutlet weak var Complaint_Image2: UIImageView!
@IBOutlet weak var Complaint_Image3: UIImageView!


func TakePhotos() {
    let Image = UIImagePickerController()
    Image.allowsEditing = true
    Image.sourceType = UIImagePickerControllerSourceType.camera
    Image.delegate = self

    present(Image, animated: true, completion: nil)
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    if let picture = info[UIImagePickerControllerOriginalImage] as? UIImage {

        if (Complaint_Image1.image != nil && Complaint_Image2.image != nil) {
            Complaint_Image3.image = picture
        }
        else if Complaint_Image1.image != nil {
            Complaint_Image2.image = picture
        }
        else {
            Complaint_Image1.image = picture
        }
    }

    if Complaint_Image1.image != nil {
        let imageData:NSData = UIImagePNGRepresentation(Complaint_Image1.image!)! as NSData
        let imageStr = imageData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0))
        let imageBase64 = imageStr
        let imgstr2 = String.init(format: "data:image/png;base64,%@", imageBase64)

        UserDefaults.standard.set(imgstr2, forKey: "image")
        UserDefaults.standard.synchronize()
    }

    let picture1 = UserDefaults.standard.object(forKey: "image")
    let parameter = ["Image1": picture1!,"Image":[["name": picture2],["name": picture3]] as [String: Any]
}
Kuldeep
  • 4,466
  • 8
  • 32
  • 59
user9772943
  • 45
  • 1
  • 7

2 Answers2

2

Just use following code to compress image before upload to server side

First of all, add below extension of uiimage to any class or singleton class

extension UIImage {

//MARK:- convenience function in UIImage extension to resize a given image
func convert(toSize size:CGSize, scale:CGFloat) ->UIImage {
    let imgRect = CGRect(origin: CGPoint(x:0.0, y:0.0), size: size)
    UIGraphicsBeginImageContextWithOptions(size, false, scale)
    self.draw(in: imgRect)
    let copied = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return copied!
    }
}

and then write below methods in controller where pick images

//MARK:- ImagePicker Delegate Methods

internal func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
    // resize our selected image
    let resizedImage = chosenImage.convert(toSize:CGSize(width:100.0, height:100.0), scale: UIScreen.main.scale)
    profileImg.image = resizedImage
    dismiss(animated:true, completion: nil)
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    dismiss(animated: true, completion: nil)
}
Kuldeep
  • 4,466
  • 8
  • 32
  • 59
Protocol
  • 1,696
  • 13
  • 30
0

You can use UIImageJPEGRepresentation compressionQualityto reduce photo size.

let picture = info[UIImagePickerControllerOriginalImage] as! UIImage

// USE ANY OF 1 FROM BELOW TO REDUCE SIZE    
let imgData1 = UIImageJPEGRepresentation(picture, 1.0)
print("1.0 size is: \(String(describing: Double((imgData1?.count)!) / 1024.0)) KB")

let imgData2 = UIImageJPEGRepresentation(picture, 0.7)
print("0.7 size is: \(String(describing: Double((imgData2?.count)!) / 1024.0)) KB")

let imgData3 = UIImageJPEGRepresentation(picture, 0.4)
print("0.4 size is: \(String(describing: Double((imgData3?.count)!) / 1024.0)) KB")

let imgData4 = UIImageJPEGRepresentation(picture, 0.0)
print("0.0 size is: \(String(describing: Double((imgData4?.count)!) / 1024.0)) KB")

// BASE64 STRING
let img1stBase64: String = (imgData2?.base64EncodedString(options: .lineLength64Characters))!
let img2ndBase64: String = (imgData3?.base64EncodedString(options: .lineLength64Characters))!
let img3rdBase64: String = (imgData4?.base64EncodedString(options: .lineLength64Characters))!

let parameter = ["Image1": img1stBase64,"Image":[["name": img2ndBase64],["name": img3rdBase64]]] as [String: Any]

OUTPUT

Here you can clearly know the difference between originalImage size and reduced image size from below.

1.0 size is: 3177.0869140625 KB
0.7 size is: 892.78125 KB
0.4 size is: 363.2890625 KB
0.0 size is: 180.8818359375 KB
Kuldeep
  • 4,466
  • 8
  • 32
  • 59