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