en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

10.11.2011

從相簿圖庫中取得影像的方法

  

在實做此方法之前,假設在裝置的圖庫中已經存有影像,如果您是使用模擬器來練習本教學,可以先參考將影像存至圖庫 Library 的方法一文,在圖庫中建立數張影像之後再實做本教學的方法。

由於示範中有使用到 UIImagePickerController 所以我們要在 ViewController 的地方加上 UIImagePickerControllerDelegate 和 UINavigationControllerDelegate 的代理,其程式碼如下。

@interface GettingPhotoViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate> {

}

接著在取得影像的按鈕事件下,鍵入以下程式碼顯來示圖庫內的所有影像。

- (IBAction)getImagefromLibrary:(id)sender {

    //宣告一個UIImagePickerController並設定代理
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;

    //設定圖片來源為圖庫
    picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

    //以動畫方式顯示圖庫
    [self presentModalViewController:picker animated:YES];
}

程式碼到此已經可以正常顯示圖庫內的所有影像,但是當我們點選影像時 UIImagePickerController 並不會對此動作做出任何反應,因為我們還沒有告訴它在點選這些影像之後該做些什麼。

回到程式碼,補上一個內建函式,此函式會在使用者點選圖庫內的影像時才被觸發,並且在函式中實做出設定影像與返回畫面的動作,程式碼如下。

//UIImagePickerController內建函式
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo {

    //設定影像
    [imageView setImage:image];

    //已動畫方式返回先前畫面
    [picker dismissModalViewControllerAnimated:YES];
}






8 則留言:

  1. 匿名7/04/2013

    您好,

    我發現如果用iPad模擬器的話,

    不會觸發- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo 這個內建涵式?

    但如果是在iPhone模擬器就正常運作.

    另外我用iPad實機執行的時候,打開相簿之後,中間原本應該顯示照片的地方卻全部都是黑色,一片黑色,非常的納悶.

    想請教您是否有遇過類似的狀況?

    謝謝

    回覆刪除
  2. 您好:

    在我沒有遇過黑色的情況,如果你存放的是一張透明背景的圖片,那底色就會是黑色,會不會是圖片存取失敗造成的。

    在ipad下要使用 UIPopoverController 才可以

    UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:你的iimagePicker];
    self.popoverController = popover;
    popoverController.delegate = self;
    [popoverController presentPopoverFromRect:CGRectMake(0, 0, 300, 300) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    你試試看吧。

    回覆刪除
  3. ynhuang1/06/2015

    您好,
    想請問在實機上,可不可以把gallery中的photo刪除呢?
    若無法刪除,可不可以用其他image覆蓋掉photo呢?

    謝謝

    回覆刪除
    回覆
    1. 您好:
      目前我沒有發現可以使用API來刪除像簿中的圖片,市面上的APP好像也沒有類似功能,大部分都是將處理完的圖片再多存一張至相簿,也只有官方的相片檢視可以在編輯完成後直接覆蓋掉原本的相片。
      通樣問題也無法覆蓋。不過或許可以透過一些小技巧來達成,只是不缺ˋ定能不能上您的APP上架就是了,你可以參考下面這些文章取得檔案名稱並加以刪除/覆蓋。

      使用 ALAssetsGroup 列舉裝置相簿中的所有資料
      http://furnacedigital.blogspot.tw/2012/12/alassetsgroup.html

      使用 AssetsLibrary 取得圖庫中檔案的相關資訊
      http://furnacedigital.blogspot.tw/2012/12/assetslibrary.html

      將影像存至相簿 Album 的方法
      http://furnacedigital.blogspot.tw/2011/04/library.html

      刪除
    2. ynhuang1/06/2015

      您好,謝謝您的回覆
      參考連結內容後,我改寫了以下內容
      ------
      UIImage *imageReplace= [UIImage imageNamed:@"000.jpg"];

      NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
      ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
      //[assetslibrary assetForURL:imageURL resultBlock:resultBlock failureBlock:failureBlock];

      [assetslibrary assetForURL:imageURL resultBlock:^(ALAsset *asset)
      {
      [asset setImageData:UIImageJPEGRepresentation(imageReplace, 1.0) metadata:nil completionBlock:^(NSURL *assetURL, NSError *error)
      {
      }];
      } failureBlock:failureBlock];
      ------
      但這樣還是無法覆蓋掉原本的image
      請問這樣的思考方向是對的嗎?或是有其他的建議

      謝謝

      刪除
    3. 你好:

      給您看看,stackoverflow的回答
      http://stackoverflow.com/questions/21477463/delete-images-from-ios-photo-gallery

      刪除
    4. ynhuang1/06/2015

      您好
      我會再參考 https://developer.apple.com/library/ios/documentation/Photos/Reference/PHAssetChangeRequest_Class/
      謝謝您

      刪除
    5. 您好:
      我才要謝謝你,PHAssetChangeRequest 我以前還真的沒看過。

      刪除