我使用以下方法从 ALAssetsLibrary 获取图像:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
信息字典中的图像格式为kCGImageAlphaNoneSkipLast
和kCGBitmapByteOrderDefault
。
稍后,例如当应用程序重新启动时,我使用referenceURL
来获取相同的图像。这次它的格式为kCGImageAlphaNoneSkipFirst
and kCGBitmapByteOrder32Little
。
通常这似乎不是问题,因为 UIImageView 和其他 UIKit 方法可以正确处理任何一个结果的 UIImage。但是,我也将此图像发送到 GLView,对于来自选取器的图像,由于所有蓝色和红色值已被交换(我可以通过交换 R 和 B 字节来纠正它),最终会出现错误的色调。
我不知道这是一个错误还是我做错了什么。如果有人能告诉我为什么会发生这种情况以及解决方法是什么,我将不胜感激。
以下是我用来获取图像的两种方法的代码:
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)
}