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

将我的应用程序创建的图像保存到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在完成块中都是零,我在相册中看不到任何新图像

从图书馆取回图片

这是一种委托方法

 - (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 ……这应该不是问题吗? 但所有其他价值都发生了变化。 我真的不知道如何获得此前的价值!

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

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

为了节省无损尝试以下:

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

有关无损保存/加载到相册中的更多信息,请阅读此主题保存到/从用户库获取JPEG而不重新压缩

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