【问题标题】:UIImage > NSData > NSString failUIImage > NSData > NSString 失败
【发布时间】:2012-12-14 12:19:35
【问题描述】:

我知道这个问题已经被问过很多次了,但是我的问题有点不同。我有一张图片(shared.image),我想将数据上传到服务器。这是代码(img: 位只是让服务器知道这是图像而不是字符串的一种方式):

NSString *imageString = [NSString stringWithFormat:@"img:%@", UIImagePNGRepresentation(shared.image)];
NSData *imageData = [imageString dataUsingEncoding:NSUTF8StringEncoding];
[shared.outputStream write:[imageData bytes] maxLength:[imageData length]];

当服务器响应(作为字符串)时,这是另一个代码(shared.array 是一个数组,用于分组所有字符串以防数据包碎片。删除 img: 位):

string = [shared.imageArray componentsJoinedByString:@""];
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
imageView.image = [UIImage imageWithData:data];

我 nslogged [UIImage imageWithData:data] 并返回 nil。 我做错了什么?

谢谢

【问题讨论】:

  • 你能将服务器响应读取为 NSData 并将其从 NSData 转换为 UIImage 吗?你确定服务器会回复一张图片吗?
  • 很遗憾没有,因为我不知道 Python 中是否有等效的 NSData(服务器是用 Python 编写的)
  • 没有。那不是我要问的。为什么要将来自服务器的响应存储为字符串 - 这就是我要问的。
  • 代码来自raywenderlich教程,将文本响应作为字符串处理

标签: objective-c nsstring uiimage nsdata


【解决方案1】:

对于 IOS >= 7

- (NSString *)imageToNSString:(UIImage *)image
{
    NSData *imageData = UIImagePNGRepresentation(image);

    return [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}

- (UIImage *)stringToUIImage:(NSString *)string
{
    NSData *data = [[NSData alloc]initWithBase64EncodedString:string
                                                      options:NSDataBase64DecodingIgnoreUnknownCharacters];

    return [UIImage imageWithData:data];
}

【讨论】:

    【解决方案2】:

    当您有二进制数据时,为什么要往返于NSString?如果你想用你的图片内容加载imageData,你可以完全绕过NSString

    NSData *imageData = UIImagePNGRepresentation(shared.image);
    

    如果您的服务器接受二进制数据,这就是您所需要的。

    如果它需要文本字符串,那么您建议的代码将无法完成这项工作,而是您应该使用 Base64 之类的东西对其进行编码(例如使用Matt Gallager's NSData+Base64 category)。例如:

    NSData *imageData = UIImagePNGRepresentation(shared.image);
    NSString *imageString = [NSString stringWithFormat:@"img:\"%@\"", [imageData base64EncodedString]];
    

    请注意,在回复中,我建议将 Base64 编码的字符串括在引号中。这样,收件人就可以检测到 Base64 编码字符串的结尾。仅供参考,我已尝试尊重您的 img: 界面,但您也可以考虑使用标准 data URI scheme,可能类似于:

    NSString *imageString = [NSString stringWithFormat:@"img:\"data:image/png;base64,%@\"", [imageData base64EncodedString]];
    

    这取决于你。

    在解析服务器响应方面,同样的问题是它是一个字符串(在这种情况下它应该是数据的 Base64 表示),还是它是否是二进制数据(在这种情况下,你应该只是将数据附加到您的NSMutableData,然后仅使用imageWithData)。

    【讨论】:

    • 我想这样做,但由于 img: 前缀(服务器使用它来知道它接收到的数据),我需要将数据放在一个字符串中。但我会尝试 base64 库
    • @GreatGoldApps 这是一个奇怪的界面,你有一个二进制数据流的文本前缀。或者如果服务器需要 Base64,我会认为这将是接口的显式部分。您不应该只是“尝试”Base64,而应该真正确定 Web 服务的期望,并为此编写代码。您是否从自己的网络服务上传和下载?或者您正在与一些已建立的 Web 服务进行交互?你能和我们分享一下细节吗?
    • 服务器是我的。代码来自这个 raywenderlich 教程:raywenderlich.com/3932/…
    • @GreatGoldApps 那么这都是你如何编写接口的服务器端的问题。使用低级套接字接口,您当然可以使用二进制,但如果是这样,您可能必须传达即将到来的图像数据的字节数(因为如果您保持套接字连接打开,否则就没有简单的方法知道当图像完成时)。 Base64 编码几乎肯定更容易,但效率较低。
    • @GreatGoldApps 我已经用 Base64 示例更新了我的答案。注意引号的使用。
    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多