以下を使用して、ALAssetsLibrary から画像を取得します。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
情報ディクショナリのイメージの形式はkCGImageAlphaNoneSkipLast
とkCGBitmapByteOrderDefault
です。
後で、たとえばアプリを再起動したときに、 を使用しreferenceURL
て同じ画像を取得します。今回はkCGImageAlphaNoneSkipFirst
とのフォーマットですkCGBitmapByteOrder32Little
。
通常、これは問題にはならないようです。これは、いずれかの結果の UIImage が UIImageView およびその他の UIKit メソッドによって正しく処理されるためです。ただし、この画像をGLViewにも送信します。ピッカーからの画像の場合、すべての青と赤の値が交換されているため、間違った色合いになります(RとBのバイトを交換することで修正できます)。
これがバグなのか、何か間違ったことをしているのかはわかりません。誰かがこれが起こっている理由と回避策を教えていただければ幸いです。
画像を取得するために使用する 2 つの方法のコードは次のとおりです。
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library assetForURL:referenceURL resultBlock:^(ALAsset *anAsset) {
CGImageRef cgImage = anAsset.defaultRepresentation.fullResolutionImage;
CGBitmapInfo info = CGImageGetBitmapInfo(cgImage);
int alphaInfo = info & kCGBitmapAlphaInfoMask;
int byteInfo = (info & kCGBitmapByteOrderMask) >> 12;
CGImageAlphaInfo otherAlpheInfo = CGImageGetAlphaInfo(originalImage.CGImage);
// I'm seeing:
// alphaInfo: 6 (kCGImageAlphaNoneSkipFirst)
// byteInfo: 2 (kCGBitmapByteOrder32Little)
// otherAlphaInfo: 6 (kCGImageAlphaNoneSkipFirst)
} failureBlock:^(NSError *error) {
originalImage = nil;
thumbnail = nil;
}];
メソッドの使用- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
:
mediaURL = info[@"UIImagePickerControllerMediaURL"];
referenceURL = info[@"UIImagePickerControllerReferenceURL"];
originalImage = info[UIImagePickerControllerOriginalImage];
if (originalImage) {
CGBitmapInfo info = CGImageGetBitmapInfo(originalImage.CGImage);
int alphaInfo = info & kCGBitmapAlphaInfoMask;
int byteInfo = (info & kCGBitmapByteOrderMask) >> 12;
CGImageAlphaInfo otherAlpheInfo = CGImageGetAlphaInfo(originalImage.CGImage);
// I'm seeing:
// alphaInfo: 5 (kCGImageAlphaNoneSkipLast)
// byteInfo: 0 (kCGBitmapByteOrderDefault)
// otherAlphaInfo: 5 (kCGImageAlphaNoneSkipLast)
}