将我的应用程序创建的图像保存到 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
得到了正确的字节数,两者error
and assetURL
完成块中为零,并且我在相册中看不到任何新图像
从库取回图像
这是一个委托方法
- (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...这应该不是问题?但所有其他价值都发生了变化。而且我现在真的不知道如何获取之前的值!
编辑:这似乎是压缩(保存图像时)和解压缩(恢复图像时)问题。
但我需要在将其保存到照片相册后获得完全相同的数据。