编辑代码

//
// ViewController.swift
// CameraUsage
//
// Created by Zhifeng Chen on 2020/8/2.
// Copyright 0 2020 Zhifeng Chen. All rights reserved.
//

import UIKit
class ViewController: UIViewController ,UINavigationControllerDelegate,UIImagePickerControllerDelegate{
    //设置围像显示用的Outlet,就是变量carImageview
    @IBOutlet weak var carImageView: UIImageview!
    //显示识别出来的车辆名称型号
    @IBOutlet weak var carName: UILabel!
    //显示该车辆百度百科里面的简介
    @IBOutlet weak var carDetails: UILabel!
    //设置Action,由相册按钮事件触发
    @IBAction func onLibrary(_sender; UIButton) {
        //设置相册拍照的控制器
        let vc = UIImagePickerController()
        //设置为相册
        vc.sourceType = .photoLibrary 
        vc.allowsEditing = true 
        vc.delegate = self
        present(vc, animated: true)
        //设置Action,由拍照按钮事件触发
        @IBAction func onCamera( sender: UIButton) {
            let vc = UIImagePickerController()
            //设置为摄像头
            vc.sourceType = .camera 
            vc.allowsEditing = true 
            vc.delegate = self
            present(vc, animated: true)
            //相册获取图片需要调用的Delegate
            uncimagepickerController(_ picker: UIImagePickerController, dFinishPickingMediaWithInfo info:[UIImagePickerController.InfoKey :Any]) {
                picker.dismiss(animated: true)
                guard let image = info[.editedImage] as? UIImage 
                else {
                    return
                }
                //将相册图片显示在carImageView中 
                carImageView.image = image
                //获得百度AI平台的 access_token
                let access_token = get baidu token() 
                if access token == "" {
                    return
                }
                else {
                    //从百度AI 获得车型信息
                    get_car_type(access_token: access_token)
                }
                //传入有效的access_token,上传图片,获得车型信息 
                func get_car type(access token; String) {
                    //获取显示的图片,并保存为jpg格式 
                    let image = carImageView.image
                    //let data = UIImagePNGRepresentation(image)
                    guard let data = image!.jpegData(compressionQuality: 0.5) 
                    else {
                        return
                    }
                    //将图片进行base64编码
                    let data_base64_str = data.base64Encodedstring()
                    //准备好获取车型的API的URL的字符串
                    let carType host = "https://aip.baidubce.com/rest/2.0/image-classify/vl/car" + "?access token=" + "\(access token)"
                    //从字符串转换为URL
                    if let url = URL(string: carType host) {
                        //从URL生成URLRequest
                        var request = URLRequest(url:url)
                        //设置HTTP HEADER中的Content-Type为application/x-www-form-urlencoded
                        request.setValue("application/x-www-form-urlencoded",forHTTPHeaderField:"Content-Type")
                        //设置为POST方法
                        request.httpMethod = "POST"
                        //将图片文件进行urlencode转码
                        let cs = NSCharacterSet(charactersIn: "/=+%").inverted
                        let image_urlEncode = data _base64_str.addingPercentEncoding(withAllowedCharacters: cs
                        //合并三个参数为一个字符串
                        let postString = "image=\(image_urlEncode!) &top_num=5&baike num=l"
                        //将字符串转为UTF8类型的数据
                        request.httpBody = postString.data(using: utf)
                        //URLSession调用
                        URLSession.shared.dataTask(with; request){ (data,response, error) in
                        if error != nil { 
                            print("error")
                        }
                        else { 
                            if let json = try? JSONSerialization,jsonObject(with:data!, options: .allowFragments) as? [String : Any]
                            let result = json("result"l as! Array<Dictionary<Any>>
                            let name = result[0]["name"] as! String
                            var description = "非车类" 
                            if name != "非车类" {
                                let baike_info = result[0]["baike info") as! Dictionary<String,String>
                                if let details = baike info["description"]  { 
                                    description = details
                                }
                                else{
                                    description = "百度百科无此车资料"
                                }
                                //转入主线程
                                DispatchQueue.main.async { 
                                    self.carDetails.textm = description 
                                    self.carNametext = name
                                }
                            }
                        }
                    
                    }
                    .resume()
                }
            }
            //以信号量方式等待网络结果返回access_token,如果没有成功,则返回"" 
            func get_baidu_token()-> String {
                let API_Key = "EIpAlhdD7i5152EsiNqpU0F1"
                let Secret_Key = "p8EZWg4agjDOxABmKvBYSNyZ1YzGFgbm"
                let token_host="https://aip.baidubce.com/oauth/2.0/token?grant_ient_credentialssclient_id-\(API_Key)&client_secret-\(Secret Key)"
                var access token=""
                //设置信号量
                let semaphore: DispatchSemaphore = DispatchSemaphore(value:0)
if let url= URListring:token host) { 
    URLSession.shared.dataTask(with; url) { (data, response, error) in
    if error != nil {
        print("network error")
    }
    else {
        if let json = try? JSONSerializationjsonObject(with:data!,options:allowFragments)as? [String :Any] {
            access_token = json["access_token"l as! String
        }
        //发出信号量
        semaphore.signal()
    }
    .resume()
    }
    else {
        print("url error")
    }
    //等待信号量
    semaphore.wait()
    return access_token
    }
}