编辑代码

//车型识别接口
# encoding:utf-8
import requests 
import base64
'''
车型识别
'''
request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/car"
# 二进制方式打开图片文件
£ = open('[本地文件]','rb')
img = base64.b64encode (f. read () )

params = "image" :img, "top num" :5)
access_token ='[调用鉴权接口获取的token]'
request_url = request url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request _uri, data=params, headers=headers)
if response:
    print (response.json() )
返回的 JSON 数据:
    {
        "log id": 4086212218842203806,
        "location result": {
        "width": 447,
        "top": 226,
        "height": 209,
        "left" : 188
    },
    "result":[{
        "baike_info": {
        "oaike_url": "mhttp://baike.baidu.con/iten/号E5号B8883号E5号8A号A0%E8 SBFSAAChiron/20419512",
        "description""布加迪Chiron是法国跑车品牌布加迪出品的豪华超跑车。配置四涡轮增压发动机,420公里每小时,有23种顾色的选择,售价高达260万美元。"
        },
        "score":0.98793351650238,
        "name":"布加迪Chiron"
        "year":"无年份信息"
    },
    {
        "score":0.0021970034576952,
        "name":"奥迪RS5",
        "year":"2011-2017"
    },
    {
        "score":0.0021096928976476,
        "name""奥迪RS4",
        "year""无年份信息"
    }
    {
        "score": 0.0015581247862428,
        "name":"奥迪RS7",
        "year": "2014-2016"
    },
    {
        "score"0.00082337751318933,
        "name""布加迪威航",
        "year": "2004-2015"
    }],
    "color_result":"颜色无法识别"
}

//6.1.3数据JSON解析实例

//搭建JSON访问Mcok服务器
//一个myjson.js文件,生成1000组文件

# myjson.js

module.exports = function() {
    var data = { users: [] }
    //Create 1000 users
    for (var i = 0; i < 1000; i++){
        data.users.push({ id: i, name: 'user' + i })
    }
    return data
}

//运行news.js程序
# news.js
let Mock = require ('mockjs') ;
Let Random = Mock.Random;
module.exports = function () {
    var data = {
        news: []
    }
    var images = [1,2, 3].map (×->Random.image ('200x100', Random.color () ,Random. word (2, 6) ) ) ;
    for (var 1 = 0; i < 100; i++) {
        var content = Random.cparagraph (0,io);
        data.news.push({
            id: 1,
            title:Random.cword (8,20) ,
            desc:content.substr (0,40),
            tag:Random.cword (2, 6) ,
            views:Random.integer (100,5000),
            images:images.slice (0, Random. integer (1,3) )
        })
    }
    return data
}

//Switf中的JSONNSerialization

import UIkit 
import Foundation

//ur1 为 MOCKMOCK 服务器的网址
if let url = URL(string: "http://localhost:3004/news") {
    URISession.shared.dataTask (with: url) { (data, response, error) in
        if error = nil {
            print ("Network errors")
        }
        else {
            let rs = String (data: data!, encoding: String. Encoding.utf8).
            print (rs)
            if let json = try? JSONSerialization. jsonObject (with: data!,options:.allowFragments) {
                print (json)
            }
        }
    }
    .resume()
}

//获取数据和下载文件

func sessionGetbata() {
    //创建 URL 对象
    let urlString = "http://www.tuling123.com/"
    let url = URL(StIIng:UILString)
    //创建请求对象
    let request = URiRequest (urL: url!:)

    let session = URLSession.shared
    let dataTask = session.dataTask(with: request,
        completionlandler: {(data, response, error) -> Vold in
        if error != nil {
            print (error.debuglescription)
        }elset{
            let str = String (data: data., encoding:String. Encoding.utf8)
            print (str!)
        }
    }) as URLSessionTask
    //使用resume方法启动任务
    datalask. resume ()
}

//6.2网络访问URKSession

//Download Task 下载文件
func sessionDownloadImage () {
    //下载地址
    let url = URL(string: "http://hangge.com/blog/images/logo.png")
    //请求
    let request = URLRequest (url: url!)

    let session = URLSession.shared
    //下载任务
    let downloadTask = session.downloadTask (with:request,completionHandler:{
    (location : URI?, response :URLResponse?, error :ErrOr?)
    -> Void in
        //输出下载文件原来的存放目录
        print ("location: \(String (describing: location))")
        //1ocation位置转换
        let locationPath = location?.path

        //获取当前时间
        let now = NSDatel
        //当前时间的时间戳
        let timeInterval: TimeInterval = now.timeIntervalSince1970
        let timeStamp = String(timeInterval)
        //拷贝到用户目录
        let documents:String = NSHomeDirectory () + "/Documents/\(timeStamp).png"
        //创建文件管理器
        let fileManager = FileManager. default
        try! fileManager.moveItem (atPath: locationPath!, toPath:documents)
        print ("new location:\(documents)")
    } )

    //使用resume 方法启动任务
    downloadTask.resume ()
}
//服务器设置和文件上传
//可以通过如下命令进行开启、关闭以及重启
$ sudo apachectl start | stop | restart


//示例程序
<?pho
/**php 接收流文件
* @param
String
Sfile 接收合保存的文件名
* @return boolean
*/
function receiveStreamFile ($receiveFile) {
    $SstreamData = isset ($GLOBALS [ 'HITP _RAW_POST DATA']) ? $GLOBALS [ 'HTTP_RAW_POST_DATA'] : '' ;

    if (empty ($streamData)) {
        $streamData = file get contents ( 'php://input');
    }

    if ($streamData!='') {
        $ret = file _put_contents ($receiveFile, $streamData, true) ;
    }else {
        $ret = false;
    }

    return $ret;
}
//定义服务器存储路径和文件名
receiveFile = $_ SERVER["DOCUMENT ROOT"]."/uploadFiles/swift.pNg";
echo $receiveFile;
sret = receivestreamFile ($receiveFile);
echo json encode (array ('success'=> (bool) $ret));

?>

//Upload Task 上传文件
func sessionUploadPhp () {
    //上传地址
    Iet url = URI(string: mhttp://1ocalhost/uploadswift.php”)
    //1.创建会话对象
    let session = URLsession. shared
    //请求
    var request = URIRequest (url: url!, cachePolicy: •reloadIgnoringCacheData)
    reguest .httpnethod ="POST"
    //上传数据流
    let fileImage = Bundle.main.path (forResource: "beel", ofType: "png")
    let imgData = try! Data (contentsOf: URL (fileURLWithPath: fileImage!))

    let uploadlask = session. uploadIask (with: request as URLRequest, from:imgData) {
        (data: Data?, response: URLesponse?, error:Error?) -> Void in
        //上传完华后
        if error != nil {
            print(error!)
        }else{ 
            let str = String (data: data!, encoding: String.Encoding. utf8)
            print("上传完毕:\(String (describing: str))")
        }
    }

    //使用resume方法启动任务
    uploadTask.resume ()
}


//6.2.2 车型识别能力的调用
import UIKit 
import Foundation

let API Key = "EIpAlhdD7i5152EsiNgpUOF_"
let Secret Key = "p8Ezwg4agi DOxABmKvBYSNyZ1YzGFqb_"

let token host = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id-\(API_Key)&client_secret=l(Secret_Key)"

var access token = ""
var expires_in: Int32 = 0

if let url = URL (string: token host) {
    URLSession.shared.dataTask (with: url) { (data, response, error) in
        if error != 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
                expires in = json ["expires in"] as! Int32
                print ("--------access_token------")
                print (access_token)
                print ("--------expires_time------")
                print (expires_in)
            }
        }
    }
    .resume ()
}
else {
    print ("url error")
}


//建立Loader可以实现文本文件和二进制文件的读入打开


//以文本或者一进制方式读入源程序文件的 Ioader
public struct Loader {
    static func readTxt (file url:URL) -> String? {
        do {
            let source = try String (contentsOf: url)
            return source
        }
        catch {
            return nil
        }
    }
    static func readBin (file url: URL) -> Data? {
        do {
            let data = try Data (contentsOf: url)
            return data
        }
        catch {
        return nil
        }
    }
}



//Resources 中的文件,并把路径转化为 URI
let path = Bundle.main.path (forResource: "grcar.jpg", ofType: nil)
let url = URL (fileURLWithPath: path!)

let data = Loader.readBin (file: url)

if (data == nil) {
    print ("File failed to load")
}

let data base64 str = data?.base64EncodedString ()
let data base64 = data?. base64EncodedData ()


access_token "24.2ec96a68£74a842900£07869929413ae.2592000.1598921312.282335-21737249"
let carType host ="https://aip.baidubce.com/rest/2.0/image-classify/v1/car"+"?access_token="+"\(access token) "
if let url = URL (string: carType host) {
    var request = URLRequest (url: url)
    request. setvalue (“application/x-www-form-urlencoded,forfrrpleaderrield:"Content-Type")
    request.httpMethod = "POST"

    let cs = NScharacterSet (charactersIn: "/=+%").inverted
    let image_urlEncode = data_base64_str!.addingPercentEncoding (withA llowedCharacters: Cs)
    let postString = "image=\(image_urlEncode!) stop_num=5&baike num=1"

    request.httpBody = postString.data (using:.utf8)

    URISession.shared.dataTask (with: request) { (data, response, error) in
        if error != nil {
            print ("error")
        }
        else {
            let rs - String (data: data!, encoding: String. Encoding. ut f8)
            print (rs!)
        }
    }
. resume ()
}


{
    "log_id": 4368540366187197442,
    "location result":
    {
    "width": 386.4585876464844,
    "top": 81.3405532836914,
    "height": 183.9795532226562,
    "left":58.03330230712891
    }, 
    "result":
    [
        {
        "score": 0.9767324924468994,
        "year": "2014-2017",
        "baike info":
            {
            "baike_url":"/item/%E5%A5%87%E7%91%9EE5/475143",
            "image_uri":
                "/pic/5882b2b7a0a20cf47a91d7777c094b36acaf9910"
            "description":
                "2014款奇瑞巴5是国内科技家轿的引领者,带领消费者悦享领先科技。"
            },
        "name""奇瑞E5"
        },
        {
        "score" : 0.007103727199137211,
        "name""奇瑞旗云""year": "2010-20131"
        "score": 0.003686367534101009,
        "name""奇瑞艾瑞泽7"
        "year": "2016-20171"
        },
        {
        "score": 0.001757977530360222,
        "name""奇瑞E3""year": "2015-2017"
        },
        {
        "score":0.001047104829922318,
        "name"" 奇瑞A5",
        "year": "2015"
        }
    ],
    "color result""黑色"
}


//6.3.1相册图片的显示


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

import UIKit

class ViewController: UIViewController, UINavigationControllerDelegateUlImagePickerControllerDelegate v{
    //设置图像显示用的Outlet,就是变量 carImageView
    @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 = UIImagePickercontroller ()
        //设置为摄像头
        vc.sourceType = . camera
        vC.allowsEditing = true
        vc.delegate = self
        present (vc, animated: true)
    }
    //相册获取图片需要调用的 Delegate
    func imagePickercontroller (_ Picker: UIImagePickercontro1ler,didFinishPickingMediawithInfo info: [UIImagePickerController.InfoKey : Any]) {
        picker.dismiss(animated: true)
        guard let image = info[.editedImage] as? UIImage 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,UIImagePickerControllerDelegate {
    //设置图像显示用的Outlet,就是变量carImageView
    @IBOutlet weak var carImageView: UI ImageView!
    //显示识别出来的年辆名称型号
    @IBOutlet weak var carName : UILabel!
    //显示该车辆百度百科里面的简介
    @IBOutlet weak var carDetails: UIIabel !
    //设置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
        ve.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 ()
        //准备好获取车型的API的URI,的宇符串
        let carType_host ="https://aip.baidubce.com/rest/2.0/image-classify/v1/car" + "?access_token=" + "\(access token) "
        //从字符串转换为URI
        if let url = URL (string: carType host) {
            //从URI生成URIRequest
            var request = URLRequest (url: url)
            //设置HTTP HEADER中的content-Type 为 application/x-www-form-urlencoded
            request.setValue("application/×-www-for-urlencoded", forHTTPHeaderField:"Content-Type")
            //设置为 POST方法
            reqruest. httpMethod ="POSI"
            //将图片文件进行urlencode转码
            let cs = NsCharacterset (charactersIn: "/=+%").inverted
            let image_urlEncode = data_base64_str.addingPercentEncoding(withAl1owedcharacters: cs)
            //合并三个参数为一个字符串
            let poststring = "image=\(image urlEncode!) &top_num=5abaike_num=1"
            //将字符串转为UTF8类型的数据
            request.httpBody = poststring.data (using:.utf8)
            //URLSession 调用
            URLSession.shared.datarask (with: request) { (data, response,error) in
                if error != nil {
                    print ("error")
                }
                else {
                    if let ison = try? JSONSerialization.jsonObject(with:data!, options: allowFragments) as? [String : Any] {
                        let result = json ["result"] as! Array<Dictionary<String,Any>>
                        let name = result [0]["name "] as! string
                        var desoription = "非车类"
                        if name != "非车类" {
                            let baike_info = result [0] ["baike_info"] as!
                            if let details = baike info ["description"'] {
                                description = details
                            }
                            else {
                                description ="百度百科无此车资料"
                            }
                        }
                        //转入主线程
                        DispatchQueue.main.async {
                            self .carDetails.text = description
                            self.carName.text = name
                        }
                    }
                }
            }
            .resume ()
        }
    }
    //以信号量方式等待网络结果返回access_token,如果没有成功,则返回""
    func get_baidu_token ()-›String {
        let API_Key = "EIpAIhaD7i5152ESiNapUOFI"
        let Secret_Key = "p8EZWg4agjDOxABmKvBYSNyZ1YzGFabm"-
        let token_host = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentialssclientid=\(API_Key)&client_secret=\(Secret_Key)"

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

        if let url = URL(string: token host) {
            URLSession. shared.dataTask (with: url) { (data, response, error) in
                if error != 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
    }
}