编辑代码

//
// ViewController.swift
// CameraUsge
//
// 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 veak 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 {
    //1从百度A工 获得车型信息
    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", fortITPHeaderField:"content-Type")
    //设置为 POSI 方法
    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 json = try? JSONSerialization. jsonObject (with:data!, options: allowFragments) as? [String : Any] {
        access_token = json ["access token"] as! String
    }
}
//发出信号量
semaphore.signal ()
}
.resume ()
}
else {
    print ("url error")
}
//等待信号量
semaphore.wait ()
return access token
}
}