1

私のアプリでは、ユーザーは uiimage 表現を取得できるアルバムまたはカメラから写真を選択できます。アルバムにはウェブからの写真が含まれている場合があるため、ファイルの種類は jpg だけではありません。次に、変換せずにサーバーに送信する必要があります。ここでは、nsdata しか使用できません。
私はUIImageJPEGRepresentationとUIImagePNGRepresentationを知っていますが、この2つの方法は元の画像を変換する可能性があると思います. 品質を1に設定すると、UIImageJPEGRepresentationが元の写真を取得できますか?
元の uiimage nsdata を取得する方法はありますか?

4

2 に答える 2

7

ALAssetsLibraryおよびを使用してALAssetRepresentation、元のデータを取得できます。例:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSURL *imageURL = [info objectForKey:UIImagePickerControllerReferenceURL];
    ALAssetsLibrary* library = [[ALAssetsLibrary alloc] init];
    [library assetForURL:imageURL resultBlock:^(ALAsset *asset) {
        ALAssetRepresentation *repr = [asset defaultRepresentation];
        NSUInteger size = repr.size;
        NSMutableData *data = [NSMutableData dataWithLength:size];
        NSError *error;
        [repr getBytes:data.mutableBytes fromOffset:0 length:size error:&error];
            /* Now data contains the image data, if no error occurred */
    } failureBlock:^(NSError *error) {
        /* handle error */
    }];
}

ただし、考慮すべき点がいくつかあります。

  • assetForURL:非同期で動作します。
  • デバイスでを使用assetForURL:すると、確認ダイアログが表示され、ユーザーを苛立たせる可能性があります。

「あなたのアプリ」はあなたの現在地を使用したいと思っています。これにより、写真やビデオの位置情報にアクセスできます。

  • ユーザーがアクセスを拒否した場合、assetForURL:失敗ブロックを呼び出します。
  • 次回このメソッドを使用するassetForURL:と、ユーザーに再度確認せずに失敗します。システム設定で場所の警告をリセットした場合にのみ、ユーザーは再度尋ねられます。

UIImageJPEGRepresentationしたがって、このメソッドが失敗して使用するかUIImagePNGRepresentation、フォールバックとして使用する準備をしておく必要があります。ただし、その場合、元のデータを取得できません。たとえば、メタデータ(EXIFなど)がありません。

于 2012-08-25T11:38:53.703 に答える
1

iOS 8.0 以降では、アセット内で対応するアセットを見つけた後、PHImageManager.default().requestImageData() を使用します (PHAsset.fetchAssets() でアセットを取得できます)。

UIImagePickerController から取得した画像をアップロードする方法と非常によく似た質問に対する私の回答で、詳細情報とコード例を参照してください。

于 2017-01-11T17:22:24.900 に答える