日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言保存图片image,iOS 保存图片到【自定义相册】

發(fā)布時間:2025/3/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言保存图片image,iOS 保存图片到【自定义相册】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

3.1、Photos 框架基本認(rèn)識,我們可以在 Help->Developer Documentation-> 選擇OC或者Swift 搜索 Photos

Photos 框架檢索

Photos 是用來處理 視頻 與 圖片 的,下面是其主要的類

<1>、PHAsset:一個 PHAsset 對象就代表相冊中的一張圖片或者一個視頻

(1)、查:[PHAsset fetch.....]

(2)、增刪改:PHAssetChangeRequest,改變圖片 (包括 圖片/視頻 相關(guān)的所有改動操作)

<2>、:PHAssetCollection: 一個PHAssetCollection就代表一個相冊

(1)、查:[PHAssetCollection fetch.....]

(2)、增刪改:PHAssetCollectionChangeRequest,改變相冊 (包括 相冊 相關(guān)的所有改動操作)

提示:所有的增刪改的操作都要放到:-[PHPhotoLibrary performChanges:completionHandler:] or -[PHPhotoLibrary performChangesAndWait:error:]'方法里面

3.2、使用 Photos 框架保存圖片到【相機膠卷】

異步操作保存到相冊

[[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{

[PHAssetChangeRequest creationRequestForAssetFromImage:self.photoimageView.image];

} completionHandler:^(BOOL success, NSError * _Nullable error) {

if (error) {

[SVProgressHUD showErrorWithStatus:@"保存失敗"];

}else{

[SVProgressHUD showErrorWithStatus:@"保存成功"];

}

}];

同步操作保存到相冊

NSError *error = nil;

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

[PHAssetChangeRequest creationRequestForAssetFromImage:self.photoimageView.image];

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"保存失敗"];

}else{

[SVProgressHUD showErrorWithStatus:@"保存成功"];

}

提示:使用 Photos 框架保存圖片到【相機膠卷】必須把代碼放到上面的兩個方法里面,否則會報下面的錯

reason: 'This method can only be called from inside of -[PHPhotoLibrary performChanges:completionHandler:] or -[PHPhotoLibrary performChangesAndWait:error:]'

3.3、創(chuàng)建新的相冊(自定義一個屬于自己app的相冊),提示:創(chuàng)建相冊之前要先判斷相冊是否存在,存在就不再創(chuàng)建

NSError *error = nil;

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

// 獲取app的名字

NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];

// 創(chuàng)建一個自定義的相冊

[PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle: appName];

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"創(chuàng)建相冊失敗"];

}else{

[SVProgressHUD showErrorWithStatus:@"創(chuàng)建相冊成功"];

}

提示一:kCFBundleNameKey = @"CFBundleName",下面的兩句是一個意思

NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];

下面是:C 的strting轉(zhuǎn)為NSString

NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleNameKey];

提示二:Foundation 和 Core Foundation 的數(shù)據(jù)類型可以相互轉(zhuǎn)換,比如:NSString * 和 CFStringRef,如下面的例子:

NSString *string = (NSString *)kCFBundleNameKey;

CFStringRef string = (CFStringRef)@"name";

3.4、查詢相冊 (自定義相冊或者系統(tǒng)相冊)

/**

PHAssetCollectionTypeAlbum = 1, 自定義相冊(普通的相冊)

PHAssetCollectionTypeSmartAlbum = 2, 智能相冊(系統(tǒng)自帶的相冊),如:Camera Roll

PHAssetCollectionTypeMoment = 3, 按照時刻分的相冊

*/

// 相機膠卷相冊,打印:Camera Roll

// PHFetchResult *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];

// 自定義相冊,打印:自定義相冊的名字

PHFetchResult *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

for (PHAssetCollection *collection in collections) {

NSLog(@"相冊的名字=%@",collection.localizedTitle);

}

3.5.創(chuàng)建相冊與查詢相冊合在一起,如下

// 獲取app的名字

NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];

/**

PHAssetCollectionTypeAlbum = 1, 自定義相冊(普通的相冊)

PHAssetCollectionTypeSmartAlbum = 2, 智能相冊(系統(tǒng)自帶的相冊),如:Camera Roll

PHAssetCollectionTypeMoment = 3, 按照時刻分的相冊

*/

// 相機膠卷相冊,打印:Camera Roll

// PHFetchResult *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];

// 自定義相冊,打印:自定義相冊的名字

PHFetchResult *collections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

// 自己的相冊

PHAssetCollection *appCollection = nil;

for (PHAssetCollection *collection in collections) {

NSLog(@"相冊的名字=%@",collection.localizedTitle);

if ([collection.localizedTitle isEqualToString:appName]) {

appCollection = collection;

break;

}

}

if (appCollection == nil) {

NSError *error = nil;

__block NSString *createCollectionID = nil;

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

// 獲取app的名字

NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];

// 獲取相冊的唯一標(biāo)識符

createCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:appName].placeholderForCreatedAssetCollection.localIdentifier;

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"創(chuàng)建相冊失敗"];

}else{

appCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createCollectionID] options:nil].firstObject;

[SVProgressHUD showErrorWithStatus:@"創(chuàng)建相冊成功"];

}

}

// 相冊一定存在

NSLog(@"相冊已經(jīng)存在");

提示:這里有一個技術(shù)點就是:根據(jù)創(chuàng)建相冊返回的相冊唯一標(biāo)識符獲取相冊對象,如下代碼:

// 自己的相冊

PHAssetCollection *appCollection = nil;

if (appCollection == nil) {

NSError *error = nil;

__block NSString *createCollectionID = nil;

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

// 獲取app的名字

NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];

// 獲取相冊的唯一標(biāo)識符

createCollectionID = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:appName].placeholderForCreatedAssetCollection.localIdentifier;

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"創(chuàng)建相冊失敗"];

}else{

appCollection = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[createCollectionID] options:nil].firstObject;

[SVProgressHUD showErrorWithStatus:@"創(chuàng)建相冊成功"];

}

}

再次提示:只有上面的block代碼執(zhí)行完才代表相冊可能存在,所以,獲取PHAssetCollection放在了下面

3.6、保存圖片到自定義的相冊

-(void)savePhotosToAppPhotoCollection{

// 同步操作保存到【相機膠卷】

__block PHObjectPlaceholder *placeholderForCreatedAsset;

NSError *error = nil;

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

placeholderForCreatedAsset = [PHAssetChangeRequest creationRequestForAssetFromImage:self.photoimageView.image].placeholderForCreatedAsset;

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"保存圖片失敗"];

return;

}

// 獲得自定義相冊

PHAssetCollection *createCollection = [JKPhotosKit createPHAssetCollection];

if (createCollection == nil) {

[SVProgressHUD showErrorWithStatus:@"創(chuàng)建相冊失敗"];

return;

}

// 添加剛才保存的圖片到 【自定義相冊】

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

// 獲取自定義對象的操作對象

PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:createCollection];

// 把圖片插入到自定義相冊的第一個位置

[request insertAssets:@[placeholderForCreatedAsset] atIndexes:[NSIndexSet indexSetWithIndex:0]];

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"保存圖片失敗"];

}else{

[SVProgressHUD showSuccessWithStatus:@"保存圖片成功"];

}

}

3.7、用戶相冊權(quán)限的判斷

// 請求或者訪問用戶訪問權(quán)限:

// 如果還沒有做出選擇,會自動彈框,用戶對彈框做出選擇后才會調(diào)用block;

// 如果用戶之前已經(jīng)做出過選擇,會自動執(zhí)行block

/**

PHAuthorizationStatusNotDetermined = 0,還沒決定

PHAuthorizationStatusRestricted = 1,沒有授權(quán),不能訪問用戶相冊

PHAuthorizationStatusDenied = 2,用戶拒絕這個應(yīng)用

PHAuthorizationStatusAuthorized = 3 用戶授權(quán)這個app訪問這個相冊

*/

// 獲取用戶之前的狀態(tài)

PHAuthorizationStatus oldStatus = [PHPhotoLibrary authorizationStatus];

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {

// 用戶決絕當(dāng)前 App 訪問相冊

dispatch_async(dispatch_get_main_queue(), ^{

if (status == PHAuthorizationStatusDenied) {

if (oldStatus != PHAuthorizationStatusDenied) {

// 提醒用戶打開開關(guān)

}else{

}

}else if (status == PHAuthorizationStatusAuthorized){

// 用戶允許當(dāng)前 App 訪問相冊

[self trueSaveImageToAppPhotoCollection:saveImage];

}else if (status == PHAuthorizationStatusRestricted){

// 因系統(tǒng)原因無法訪問相冊

[SVProgressHUD showErrorWithStatus:@"因系統(tǒng)原因無法訪問相冊"];

}

});

}];

提示:上面所有的完整代碼都在 JKPhotosKit類里面,需要的請下載 demo

JKPhotosKit 類的使用方法:保存圖片到自定的相冊

[JKPhotosKit savePhotosToAppPhotoCollection:UIImage對象];

效果圖

總結(jié)

以上是生活随笔為你收集整理的c语言保存图片image,iOS 保存图片到【自定义相册】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。