//
//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
}
}