编辑代码

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

import UIKit


class ViewController: UIViewcontroller , UINavigationControllerDelegate,UITmagePickerControllerDelegate{
    //设置因像显示用的outlet,就是变量 car ImageView
    @IBOutlet weak var carImageView: UIImageView!
    //设置 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 = UlImagePickerController ()
            //设置为摄像头
            vc. sourceType = .camera
            vc.allowsEditing = true
            vc. delegate = self
            present (vC, animated: true)
        }
            //相册获取图片需要调用的 Delegate
            func imagePickerController|_ picker: UIImagePickerController didFinishPickingMediawithInfo info: [UI ImagePickerController.InfoKey: Any]){
            picker. dismiss (animated: true)
            guard let image = infol.editedImage\ as? UI Image else {
                return
        }
        // 将相册图片显示在 carImageview 中
        carImageView.image = image
    }
}

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

import UIKit


class viewcontroller: UIViewcontroller , UINavigationcontrol1erDelegate,UIInagePickercontrollerDelegatet{
    //设置图像显示用的outlet,就是变量 car Imageview
    @IBOutlet weak var carImageview : UIImageview!
    //显示识别出来的车辆名称型号
    @IBOutlet weak var carDetails: UILabel !
    //设置 Action,由相册按钮事件触发
    @IBAction func onlibrary ( sender: UIButton) {
        //设置相册拍照的控制器
        let ve = UIImagePickercontroller ()
        //设置为相册
        vC.sourceType = .photoLibrary
        vc.allowsEditing = true
        vc.delegate = self
        present (vc, animated: true)
        }
        // 设置Action,由拍照按钮事件触发
        @IBAction func onCamera ( sender: UIButton) {
            let vc = UIInagePickerController ()
            //设置为摄像头
            vc. sourceType = .camera
            vc.allowsEditing = true
            vc.delegate = self
            present (vc, animated: true)
            }
            //相册获取图片需要调用的 Delegate
            func imagePickerController ( picker: UIImagePickerController,didFinishPickingMediaWithInfo 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 ()
    //准备好获取车型的AB工 的URI, 的字符串
    let carType host = "https: //aip.baidubce.com/ rest /2.0/ image-classify/v1/car" + "?access token=" + "' (access token) "
    //从字符串转换为 URL
    if let url = URI (string: carrype host) {
        //从 URI 生成 URIRequest
        var reguest = URLReguest (url: url)
        //设置 ETP 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: "/=+8").inverted
        let image urlEncode = data base64 str .addingPercentEncoding (withAllovedCharacters:cs)
        //合并三个参数为一个字符串
        let poststring = "image=1 (image_ ur1Encode !) atop num=5abaike num-1"
        //将字符串转为UTF8 类的数据
        request.httpBody = postString.data (using: .utf8)
        //URLSession 调用
        URISession. 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 = son ["result") as! Array<Dictionary<String, Any>>
                    let name = result [0] ("name"] as! String
                    var description ="非车类”
                    if name != n 非车类"{
                        let baike info = result [0] ["baike info"] as!Dictionary<String, String>
                        if let details = baike info["description"] {
                            description = details
                    }
                    else {
                    desoription = "百度百科无此车资料"
                }
            }
            //转入主线程
            DispatchQueue.main.async {
                self .carDetails.text = description
                self.carName.text = name
                }
            }
        }
    }
    •resume ( )
    }
}
//以信号量方式等待网络结果返回access_token,如果没有成功,则返回"”
func get baidu_ token () -›String {
    let API_Key = "EIpAlhdD7i5152EsiNgpU0F1"
    let Secret_Key = "p8EZWg4ag]DOxABmKvBYSNyZ1ŸzGFqbm"
    let token host = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client credentials&client id=\(API Key) §client secret=\ (Secret _Key) "

    var access token = ""
    //设置信号量
    let semaphore: DispatchSemaphore = DispatchSemaphore (value: 0)

    if let url = URL (string: token host) {
        URI.Session. shared. datalask (with: url) { (data, response, error) in 
            iferror!= nil {
            print ("network error")
            }
            else {
                if let jnon - try? JSONSerialization.)sondbject (with:data!,options: .allowFragments) as? [String : Any] {
                    access_token - jnon["access_token"] as! string
                //发出信号量
                semaphore.signal()
            }
            .resume()}
            else {
                print("url error")
                // 等待信号量
                semaphore.wait()
                return access_token
            }
        }