1

我使用以下方法从 ALAssetsLibrary 获取图像:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

信息字典中的图像格式为kCGImageAlphaNoneSkipLastkCGBitmapByteOrderDefault

稍后,例如当应用程序重新启动时,我使用referenceURL来获取相同的图像。这次它的格式为kCGImageAlphaNoneSkipFirstand 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)
}
4

0 回答 0