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

Tom*_*uce 2 uiimageview uiimage nsdata ios

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

这部分很好用.我将图像保存在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 ...
Run Code Online (Sandbox Code Playgroud)

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

NSData *data = [[[MyUser sharedUser] picture] dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO];
self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:data]];
Run Code Online (Sandbox Code Playgroud)

要么

NSData *data = [[[MyUser sharedUser] picture] dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
self.imageView.image  = [UIImage withData:data];
Run Code Online (Sandbox Code Playgroud)

但这不起作用.

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

你能帮助我吗?

编辑:

转换并保存

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"];
Run Code Online (Sandbox Code Playgroud)

加载图像

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

Rob*_*Rob 5

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

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

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

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

因此要转换NSDataNSStringbase64表示:

NSString *string;

if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
    string = [data base64EncodedStringWithOptions:kNilOptions];  // iOS 7+
} else {
    string = [data base64Encoding];                              // pre iOS7
}
Run Code Online (Sandbox Code Playgroud)

并将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
}
Run Code Online (Sandbox Code Playgroud)