从SQL数据库保存并加载图像

时间:2013-11-05 15:11:26

标签: ios uiimageview uiimage nsdata

我正在尝试从我的数据库中显示图像。

这部分很好用。 我将图像保存在DB中,如下所示:

UIImage *resizedImg = [Generics scaleImage:self.photo.image toResolution:self.photo.frame.size.width and:self.photo.frame.size.height];
NSData *imgData = UIImageJPEGRepresentation(resizedImg, 0.9);
NSString *stringDataImage = [NSString stringWithFormat:@"%@",imgData];
[dict setObject:stringDataImage for key@"image"];
// POST Request to save the image in DB ...

现在,当我尝试加载图片并将其设置为我的UIImageView时,我这样做:

NSData *data = [[[MyUser sharedUser] picture] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];
self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:data]];

或者

NSData *data = [[[MyUser sharedUser] picture] dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
self.imageView.image  = [UIImage withData:data];

但这不起作用。

data不等于imgData,我认为这是编码,但我可以找到好的编码。 [UIImage withData:data]返回nil;

你能帮助我吗?

编辑:

转换并保存

UIImage *resizedImg = [Generics scaleImage:self.photo.image toResolution:self.photo.frame.size.width and:self.photo.frame.size.height];
NSData *imgData = UIImageJPEGRepresentation(resizedImg, 0.9);
[dict setObject:[imgData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength] forKey:@"image"];

加载图片

NSData *data = [[NSData alloc] initWithBase64EncodedData:[[MyUser sharedUser] picture] options:kNilOptions];
NSLog(@"%@", data);
self.image.image = [UIImage imageWithData:data];

2 个答案:

答案 0 :(得分:5)

您正在将NSData转换为字符串并将其保存到数据库中。两个问题:

  1. 您选择使用stringWithFormat构造是数据的低效字符串表示(导致字符串表示大小约为两倍)。您可能希望使用base64(字符串表示仅增加33%)。

  2. 您正在保存字符串表示形式,但在检索它之后永远不会将其转换回二进制格式。您可以编写一个例程来执行此操作,但最好只使用已建立的base64格式。

  3. 如果要将图像保存为数据库中的字符串,则应使用base64。从历史上看,我们会将您引导到许多第三方库中的一个(请参阅How do I do base64 encoding on iphone-sdk?),以便将二进制数据转换为base64字符串(并返回),或者,iOS 7现在具有native base 64 encoding(并公开了私有iOS 4方法,以防您需要支持早期版本的iOS)。

    因此,要将NSData转换为NSString base64表示形式:

    NSString *string;
    
    if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
        string = [data base64EncodedStringWithOptions:kNilOptions];  // iOS 7+
    } else {
        string = [data base64Encoding];                              // pre iOS7
    }
    

    将base64字符串转换回NSData

    NSData *data;
    
    if ([NSData instancesRespondToSelector:@selector(initWithBase64EncodedString:options:)]) {
        data = [[NSData alloc] initWithBase64EncodedString:string options:kNilOptions];  // iOS 7+
    } else {
        data = [[NSData alloc] initWithBase64Encoding:string];                           // pre iOS7
    }
    

答案 1 :(得分:2)

如果您真的想将二进制数据转换为字符串,则应使用base64编码。幸运的是,NSData现在支持Base64

所以你可以通过以下方式从数据中获取字符串:

NSString *stringDataImage = [imgData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

你可以用:

将其转回NSData
NSData *imgData = [[NSData alloc] initWithBase64EncodedString:stringDataImage options:kNilOptions];