日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

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

Photos 框架檢索

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

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

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

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

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

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

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

提示:所有的增刪改的操作都要放到:-[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、創建新的相冊(自定義一個屬于自己app的相冊),提示:創建相冊之前要先判斷相冊是否存在,存在就不再創建

NSError *error = nil;

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

// 獲取app的名字

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

// 創建一個自定義的相冊

[PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle: appName];

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"創建相冊失敗"];

}else{

[SVProgressHUD showErrorWithStatus:@"創建相冊成功"];

}

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

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

下面是:C 的strting轉為NSString

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

提示二:Foundation 和 Core Foundation 的數據類型可以相互轉換,比如:NSString * 和 CFStringRef,如下面的例子:

NSString *string = (NSString *)kCFBundleNameKey;

CFStringRef string = (CFStringRef)@"name";

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

/**

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

PHAssetCollectionTypeSmartAlbum = 2, 智能相冊(系統自帶的相冊),如: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.創建相冊與查詢相冊合在一起,如下

// 獲取app的名字

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

/**

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

PHAssetCollectionTypeSmartAlbum = 2, 智能相冊(系統自帶的相冊),如: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"];

// 獲取相冊的唯一標識符

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

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"創建相冊失敗"];

}else{

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

[SVProgressHUD showErrorWithStatus:@"創建相冊成功"];

}

}

// 相冊一定存在

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

提示:這里有一個技術點就是:根據創建相冊返回的相冊唯一標識符獲取相冊對象,如下代碼:

// 自己的相冊

PHAssetCollection *appCollection = nil;

if (appCollection == nil) {

NSError *error = nil;

__block NSString *createCollectionID = nil;

[[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{

// 獲取app的名字

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

// 獲取相冊的唯一標識符

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

} error:&error];

if (error) {

[SVProgressHUD showErrorWithStatus:@"創建相冊失敗"];

}else{

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

[SVProgressHUD showErrorWithStatus:@"創建相冊成功"];

}

}

再次提示:只有上面的block代碼執行完才代表相冊可能存在,所以,獲取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:@"創建相冊失敗"];

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、用戶相冊權限的判斷

// 請求或者訪問用戶訪問權限:

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

// 如果用戶之前已經做出過選擇,會自動執行block

/**

PHAuthorizationStatusNotDetermined = 0,還沒決定

PHAuthorizationStatusRestricted = 1,沒有授權,不能訪問用戶相冊

PHAuthorizationStatusDenied = 2,用戶拒絕這個應用

PHAuthorizationStatusAuthorized = 3 用戶授權這個app訪問這個相冊

*/

// 獲取用戶之前的狀態

PHAuthorizationStatus oldStatus = [PHPhotoLibrary authorizationStatus];

[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {

// 用戶決絕當前 App 訪問相冊

dispatch_async(dispatch_get_main_queue(), ^{

if (status == PHAuthorizationStatusDenied) {

if (oldStatus != PHAuthorizationStatusDenied) {

// 提醒用戶打開開關

}else{

}

}else if (status == PHAuthorizationStatusAuthorized){

// 用戶允許當前 App 訪問相冊

[self trueSaveImageToAppPhotoCollection:saveImage];

}else if (status == PHAuthorizationStatusRestricted){

// 因系統原因無法訪問相冊

[SVProgressHUD showErrorWithStatus:@"因系統原因無法訪問相冊"];

}

});

}];

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

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

[JKPhotosKit savePhotosToAppPhotoCollection:UIImage對象];

效果圖

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。