【问题标题】:How to get valid base64 string for an image如何获取图像的有效 base64 字符串
【发布时间】:2014-01-07 12:32:22
【问题描述】:

我使用以下代码来获取我的图像的 base64 编码字符串:

UIImage *image = [photoView image];
NSString *encoded = [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

图像为 800*800 像素,但生成的字符串太大,以至于当我将其粘贴到文本框中时会导致浏览器崩溃。我将它粘贴到dreamweaver 中计算行数,超过300.000 行。这不可能。如果我将同一张图片上传到this site,它会生成一个大约 200 行的 base64 字符串。

如何在目标 c 中生成“正常”base64 字符串?一个我可以实际使用的...

正如 Martin R 建议的那样,我检查了 UIImagePNGRepresentation(image) 返回的数据长度,它是 4502370 字节。这可能是问题的一部分。会不会是在 UIImageView 中绘制图像并稍后检索它,就像我正在做的那样,会返回屏幕大小的图像?

【问题讨论】:

  • 你可以试试:UIImageJPEGRepresentation(image, 0.9f)
  • 为什么不从NSData *data = UIImagePNGRepresentation(image) 开始并检查[data length] 以隔离问题?
  • …所以这不是 Base64编码器的问题。
  • @MartinR 实际上,我正在从相机中检索图像,然后重新缩放它,但它似乎没有正确重新缩放。 image.size 正确缩小到 800*800,但是重新缩放后数据长度增加了....
  • 您看到的任何差异都可能是压缩方面的差异。

标签: ios objective-c xcode ios7


【解决方案1】:

通过使用NSDataBase64Encoding64CharacterLineLength,您可以将每行限制为 64 个字符(如文档中所述)。试试:

NSString *encoded = [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:0];

【讨论】:

  • 我这样做是为了计算行数,我之前使用过 NSDataBase64EncodingEndLineWithCarriageReturn。我现在用 0 试试。
【解决方案2】:

base-64 编码的字符串是二进制数据大小的 1.37 倍。因此:

800x800x4(32 位 RGBA)= 2,560,000 字节

x 1.37 = 3,507,200 字节

我不明白您为什么要将 base-64 编码的字符串粘贴到浏览器中?

【讨论】:

  • 我把它粘贴到在线的base64解码器中看看是否成功。
  • UIImagePNGRepresentation() 返回 PNG 数据,而不是原始数据。但是当然,如​​果图像压缩得不好,那也可能同样大。
  • 当然,PNG 应该是经过压缩的,尽管压缩量变化很大。
  • @MartinR 当然,关键是生成的字符串总是太大而无法粘贴到任何你喜欢的地方。
  • 目前还不清楚 OP 提到的网站上正在发生什么样的图像压缩。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多