我正在尝试从我的数据库中显示图像。
这部分很好用。 我将图像保存在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];
答案 0 :(得分:5)
您正在将NSData
转换为字符串并将其保存到数据库中。两个问题:
您选择使用stringWithFormat
构造是数据的低效字符串表示(导致字符串表示大小约为两倍)。您可能希望使用base64(字符串表示仅增加33%)。
您正在保存字符串表示形式,但在检索它之后永远不会将其转换回二进制格式。您可以编写一个例程来执行此操作,但最好只使用已建立的base64格式。
如果要将图像保存为数据库中的字符串,则应使用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];
你可以用:
将其转回NSDataNSData *imgData = [[NSData alloc] initWithBase64EncodedString:stringDataImage options:kNilOptions];