将其保存到iOS中的照片库后,取回UIImage数据

时间:2014-02-17 20:15:17

标签: ios iphone objective-c uiimage uiimagepickercontroller

将我的应用创建的图片保存到iPhone库并尝试将其恢复后,我遇到了问题。图像数据不同。

创建图片

1.Code

我创建了一个不使用alpha的图像(事实上,如果我使用alpha,我得到的结果相同)

+ (UIImage *)createImageFromData:(NSData *)data {
    uint8_t *imageData = (uint8_t *) calloc(WIDTH * HEIGHT * 3, sizeof(uint8_t));
    [data getBytes:imageData];
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,
                                                              imageData,
                                                              WIDTH * HEIGHT * 3,
                                                              NULL);
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

    CGImageRef imageRef = CGImageCreate(WIDTH,
                                        HEIGHT,
                                        8, // Bits per color component
                                        3 * 8, // Bits per pixel : 1 pixel => 3 component
                                        3 * WIDTH, // bytes per lign (1 byte = 1 component)
                                        colorSpace,
                                        bitmapInfo,
                                        provider,
                                        NULL,
                                        NO,
                                        renderingIntent);
    UIImage *resultImage = [UIImage imageWithCGImage:imageRef];

    return resultImage;
}

2.Debug

这是我在方法结束时进行破解时使用lldb得到的内容

(lldb) p (int)imageData[0]
(uint8_t) $0 = 102
(lldb) p (int)imageData[1]
(uint8_t) $1 = 116
(lldb) p (int)imageData[2]
(uint8_t) $2 = 121
(lldb) p (int)imageData[3]
(uint8_t) $3 = 112

保存图片

- (IBAction)saveImage:(id)sender {
    UIImageWriteToSavedPhotosAlbum(_image, self,
   @selector(image:didFinishSavingWithError:contextInfo:), nil);
}

编辑:我尝试了另一种保存图像的方法:

CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.generatedImageView.image.CGImage));
uint8_t *data = (uint8_t *)CFDataGetBytePtr(pixelData);
NSData *dataToSave = [NSData dataWithBytesNoCopy:data length:CFDataGetLength(pixelData) freeWhenDone:NO];

ALAssetsLibrary *assetLib = [[ALAssetsLibrary alloc] init];
[assetLib writeImageDataToSavedPhotosAlbum:dataToSave metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
    NSLog(@"%@", error);
}];

DataToSave得到了正确的字节数,errorassetURL在完成块中都是nil,我在相册中看不到任何新图片

从图书馆取回图片

这是一个委托方法

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];

    // Handle a still image picked from a photo album
    if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0)
    == kCFCompareEqualTo) {
        self.image = (UIImage *) [info objectForKey:UIImagePickerControllerOriginalImage];
    }
    [self dismissViewControllerAnimated:YES completion:nil];
}

从上一张图片中取回数据

1.Code

+ (NSData *)createDataFromImage:(UIImage *)image {
    CGImageRef imageRef = [image CGImage];

    CFDataRef pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage));
    uint8_t *data = (uint8_t *)CFDataGetBytePtr(pixelData);

    return [NSData dataWithBytesNoCopy:data length:SIZE freeWhenDone:YES];;
}

2.Debug

现在我有什么

(lldb) p (int)data[0]
(int) $4 = 35
(lldb) p (int)data[1]
(int) $5 = 72
(lldb) p (int)data[2]
(int) $6 = 100
(lldb) p (int)data[3]
(int) $7 = 255

alpha分量的值为255 ......这应该不是问题吗?但所有其他价值都发生了变化。我真的不知道如何获得此前的价值!

编辑:它似乎是一个压缩(保存图像时)和解压缩(当它回来时)问题。 但是我需要在照片专辑中保存完全相同的数据。

2 个答案:

答案 0 :(得分:1)

您的图像在保存到相册之前会被压缩为JPEG格式。并在加载时解压缩。 JPEG是有损压缩。因此,当您比较像素数据时,原始图像与压缩/解压缩之间存在差异。

为了节省无损,请尝试以下操作:

+ (void)saveImageData:(NSData *)data {
    ALAssetsLibrary *assetLib = [[[ALAssetsLibrary alloc] init] autorelease];
    [assetLib writeImageDataToSavedPhotosAlbum:data metadata:nil completionBlock:nil];
}

有关无损保存/加载相册的更多信息,请阅读此主题Saving to/getting JPEG from user gallery without recompression

答案 1 :(得分:0)

您无法使用保存的照片相册图片管理文件比较过程,因为它会自动在您保存的图像中嵌入更多详细信息,例如有关位置,时间等的详细信息...将图像保存到照片库时。因此,它与检索后的输入图像不同。