1. 程式人生 > >iOS 選取圖片 後臺給旋轉 多圖上傳 代理方法不執行

iOS 選取圖片 後臺給旋轉 多圖上傳 代理方法不執行

經歷了一個新的專案,也是一個新的團隊.圖片上傳,成了重點.

1.圖片上傳伺服器之後,在獲取的時候被旋轉了90度.

    解決辦法為:將回調的image物件進行如下處理,

if (image.imageOrientation != UIImageOrientationUp)
    {
        UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
        [image drawInRect:(CGRect){0,0,image.size}];
        UIImage * normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        image = normalizedImage;
    }

2.有的照片在沒有完全從icould下載完成的時候,代理方法獲取到的image為nil.或者選取圖片的代理方法不走.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;

第一個代理方法選取的照片為沒有完全從icould下載完成,那麼這個代理方法是不執行的.(上傳後臺可能不被旋轉)

第二個代理方法獲取圖片方法如下,這個代理方法執行,但是獲取到的image物件是空的,這需要我們用程式碼是去判斷,不然對image進行操作的話,容易因為image為nil造成崩潰.(上傳後臺可能被旋轉)

 UIImage *image = info[UIImagePickerControllerOriginalImage];

3.多圖上傳.

這個需要後臺的配合,oc程式碼實現如下

+ (void)post:(NSString *)url target:(UIViewController *)target params:(NSDictionary *)params fileDatas:(NSArray *)fileDatas name:(NSString *)name fileNames:(NSArray *)fileNames mimeTypes:(NSArray *)mineTypes success:(void (^)(id json))success failure:(void (^)(NSError *error))failure
{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
    if (target)
    {
        [MBProgressHUD showHUDAddedTo:target.view animated:YES];
    }
    // 1.建立一個管理者
    AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
    session.requestSerializer.timeoutInterval = 10;
    session.responseSerializer = [AFHTTPResponseSerializer serializer];
    session.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html",@"image/png", @"text/plain",nil];//,@"text/plain"
    // 2.傳送請求
    NSDictionary * dic = [BaseHttp encryptionDictionary:params withEnp:YES];
    JMLog(@"%@",dic);
    [session POST:url parameters:dic constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData)
    {
        // 在傳送請求之前會自動呼叫這個block
        // 需要在這個block中新增檔案引數到formData中
        if (fileDatas.count == fileNames.count && fileNames.count == mineTypes.count)
        {
            for (int i = 0; i < fileDatas.count; i++)
            {
                [formData appendPartWithFileData:fileDatas[i] name:[NSString stringWithFormat:@"%@%d",name,i] fileName:fileNames[i] mimeType:mineTypes[i]];
            }
        }
    } progress:^(NSProgress * _Nonnull uploadProgress)
    {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)
    {
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
        if (target)
        {
            [MBProgressHUD hideHUDForView:target.view];
        }
        if (success)
        {
            success([BaseHttp decodingData:responseObject]);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
    {
        [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
        if (target)
        {
            [MBProgressHUD hideHUDForView:target.view];
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;

} if (failure) { failure(error); } }];}

呼叫示例:這個方法要求傳入的不是iamge物件.是UIImageJPEGRepresentation方法轉換之後的圖片

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

    NSDictionary * params = @{@"type":@"3"};
    NSArray * array = @[UIImageJPEGRepresentation([UIImage imageNamed:@"card_placeholder_1"], 0.5),UIImageJPEGRepresentation([UIImage imageNamed:@"card_placeholder_2"], 0.5),UIImageJPEGRepresentation([UIImage imageNamed:@"card_placeholder_3"], 0.5),UIImageJPEGRepresentation([UIImage imageNamed:@"card_placeholder_1"], 0.5),];

    [BaseHttp post:[NSString stringWithFormat:@"%@%@",@"http://img.upload.com",@"/appinlet/test_upload"] params:params fileDatas:array name:@"image" fileNames:@[@"1",@"2",@"3",@"4"] mimeTypes:@[@"image/png",@"image/png",@"image/png",@"image/png"] success:^(id json)
    {
        JMLog(@"%@",json);
    } failure:^(NSError *error)
    {
        JMLog(@"%@",error);
    }];
}

總結:圖片選取應該這麼幹,非空判斷,防止圖片被後臺旋轉

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{
    UIImage * image = info[UIImagePickerControllerOriginalImage];
    if (!image)
    {
        return;
    }
    if (image.imageOrientation != UIImageOrientationUp)
    {
        UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);
        [image drawInRect:(CGRect){0,0,image.size}];
        UIImage * normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        image = normalizedImage;
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

相關推薦

iOS 選取圖片 後臺旋轉 代理方法執行

經歷了一個新的專案,也是一個新的團隊.圖片上傳,成了重點.1.圖片上傳伺服器之後,在獲取的時候被旋轉了90度.    解決辦法為:將回調的image物件進行如下處理,if (image.imageOrientation != UIImageOrientationUp)

file input標籤支援圖片、視訊、

說明 1)file input 標籤的三個屬性合理使用可支援圖片上傳,視訊上傳,多圖上傳 2)即accept、capture、multiple三個屬性 各屬性介紹 1、accept屬性 直接開啟系統檔案目錄,規定在檔案上傳中伺服器只接受影象檔案 屬性

js圖片預覽,php後臺接收例項,已改寫為預覽

上傳圖片預覽這個出自超實用的js程式碼段,關於圖片的處理那一章,php後臺接收是網上比較少這方面的資源或者寫得很複雜,這裡簡單記錄。都是基於js 首先先呼叫兩個資料夾animateManage.js和viewimg.js,可以在網上下載。相當好用。 關鍵點是FileRead

實現點擊單個圖片

cells any cell sage cookie append toast its cin 這是一個通過接口實現上傳圖片,然後調用另一個接口統一提交的方法 結構 <div class="load-box"> <label for="b

iOS 使用AFN 進行單

圖片上傳時必要將圖片進行壓縮,不然會上傳失敗 1.單張圖上傳 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];    [manager POST:urlStr

小程式圖片

//上傳圖片 多圖 choosePic: function() { var that = this; wx.chooseImage({ count: 9, // 預設9 sizeType: ['compressed'], //

小程式如何實現圖片預覽效果?(程式碼示例)

wxml程式碼: <view class="weui-uploader__hd"> <view class="weui-uploader__title">點選可預覽選好的圖片</view> <view class="weui-

react-native react-native-image-picker圖片圖片

話不多說 直接貼程式碼, 如有疑問 下方留言或者發郵箱 引入需要的元件 import ImagePicker2 from 'react-native-image-picker'; import RNHeicConverter from 'react-native

記錄 呼叫微信圖片 前端 後端Java下載儲存(

測試頁面 <template>     <div id="test">         <button @click="wxchoose">微信上傳測試</butt

【功能點】前端vue過來的是base64格式(解碼變成二進位制)的圖片怎麼做

                此是tp5框架,控制器中的程式碼 總體思路: 1、先接收資料,遍歷到是字串為止 2、處

H5實現與預覽,圖片壓縮

 H5多圖上傳,並實現壓縮(可根據實際情況選擇對多大的圖片進行壓縮,本例為大於512KB的進行壓縮)和預覽 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT

【功能點】tp3.1使用webuploader0.1.5外掛後臺php原生接收

效果: 對應的效果是: 1、上傳圖片:選擇圖片-》開始上傳圖片(上傳成功後)-》會顯示上傳成功 && 可以通過下拉框和文字框,一起上傳 2、刪除圖片:點選刪除,刪除整個節點 3、修改圖片附屬資訊:就是修改下拉框和文字框中的值 亮點在於: 1、前端

UEditor圖片後,展示的順序與選擇時順序一致()

UEditor多圖上傳時,由於後臺上傳介面返回的時間不同,會造成顯示上傳後的圖片與選擇時的圖片順序不一致的問題。 舉個栗子: 多圖上傳時,先後選擇了a.png和b.png,其中a.png大小為900k,b.png大小為5k,當上傳成功後點擊確認按鈕, 發現b

控制器及模型代碼(2)thinkphp5+layui實現保存到數據庫,可以實現圖片自由排序,自由刪除。

each ons param remove mon ret value settime item 公共css代碼 <style> .layui-upload-img { width: 90px; height: 90px; margin: 0;

bootstrap file input 實現功能

slow customer dex event view 文件 all shee end 官方文檔 http://plugins.krajee.com/ demo http://plugins.krajee.com/file-input-ajax-demo/3

Thinkphp5

lena action val clas 錯誤 err each form files html代碼 <div class="content" id="content_list"> <!-- 上傳部分 -->

Vue的移動端插件vue-easy-uploader

ext gin ted log code 支持 使用 tip master 原文地址 前言 這段時間趕項目,需要用到多文件上傳,用Vue進行前端項目開發。在網上找了不少插件,都不是十分滿意,有的使用起來繁瑣,有的不能適應本項目。就打算自己折騰一下,寫一個Vue的上傳插件,一

tp5

html inf pic hidden download jquery 獲得 後臺 filetype 首先是最終的完成效果 這裏是源代碼下載地址 https://pan.baidu.com/s/1eSAQoSy 然後是具體的詳細步驟(圖片為網上參考,代碼是實際寫出效果

【轉載】laravel中使用WangEditor及

1.2 sources views created select pic head 使用說明 token 1. 創建項目及安裝所需安裝包 1.1 創建項目 composer create-project laravel/laravel=5.3 blog_wangeditor

jQuery預覽

<!doctype html> <html> <head> <meta charset="utf-8"> <title>jQuery多圖上傳預覽</title> <script src="http://libs.baidu