繁体   English   中英

使用Objective-C截取Base64字符串(解码为png时)

[英]Base64 String when decoded to png is cut off with Objective-C

我正在使用此代码将从URL检索的图像转换为base 64。

NSURL* imageUrl = [NSURL URLWithString:url];
NSData* urlData = [NSData dataWithContentsOfURL:imageUrl];
UIImage* uiImage = [UIImage imageWithData: urlData];
NSData* imageData =  UIImagePNGRepresentation(uiImage);
NSData*  base64 = [imageData base64EncodedDataWithOptions:0];
return [NSString stringWithUTF8String:[base64 bytes]];

图片网址: https//api.qrserver.com/v1/create-qr-code/? data = somedata size = 220x220 margin = 0

生成的base64图像。

iVBORw0KGgoAAAANSUhEUgAAANwAAADcCAMAAAAshD+zAAAABlBMVEX///8AAABVwtN+AAAAHGlET1QAAAACAAAAAAAAAG4AAAAoAAAAbgAAAG4AAASMOw2BmAAABFhJREFUeAHsmdFq5VYQBO3//+lADqgKUZcjpNU6xLNP5e7puVLPTWI2X99/6s9X/WF5uV/Y3/gSH6L3P1vF04lYKRHEnpdTF5dwLnetJr5tEEk0EfZ8LdXFJZyv5bWa9HU7kOQhGbDna6kuLuFv+Vr6+3KVVSCRFLHVp0RwF2cyyXE4Rzci6f6HJuOENrZ25mSKbP/e1Zh5RG861BQP92v3kbu4NhU6DtfkTiOtllPUJnyJILZ2Yu/IcXiXKp+0HiRFpfElgtjaib0jx+FdqnzSepAUlcaXCGJrJ/aOHId3qfJJ60FSVBpfIoitndg7chzepconrQdJUWl8iSC2dmLvyHF4lyqftB4kRaXxJYLY2om9I8fhXap80nqQFJXGlwhiayf2jhyHSaE15SSiiLzEDZLRy0lMZKfs/C+q/MTehAoRR9sRmXm51QWNuRs4fWxRTiKKCEncIJm53OqCwtwNnD62KCcRRYQkbpDMXG51QWHuBk4fW5STiCJCEjdIZi63uqAwdwOnjy3KSUQRIYkbJDOXW11QmLuB08cW5eRGxM5fitL+L14ua8inlwhmXGJixxlNH1uUkxsRey63qqQRVZuYk1ljxiX2pkPNycO991d72pnIetnzcirjX+yaDlXjh2bAt3ow9vzbcnVxVKOvYv91urpL7E2HqsyhGfCtHow9l1tdHNW8fTk+SKR7JDIqO0X5YE7qRdMnLspJxCTFEwnJTlE+mJPzchS0qGtCLTrvOP9MRk6K8sGcnMtR0KKuCbXovOP8Mxk5KcoHc3IuR0GLuibUovOO889k5KQoH8zJuRwFLeqaUIvOO84/k5GTonwwJ3/f5ahhR1T3+Jfc46Ny5+FuwXF4G4sB0vNyqwtK2nXD5HXyTvh6nknSc7n

我发现该图像仅减半,因为我使用此工具进行了检查。

http://codebeautify.org/base64-to-image-converter

无论如何,我可以生成包含整个图像的base64image字符串吗?

    NSURL* imageUrl = [NSURL URLWithString:@"https://api.qrserver.com/v1/create-qr-code/?data=somedata&size=220x220&margin=0"];
    NSData *data = [NSData dataWithContentsOfURL:imageUrl];
    UIImage *image = [UIImage imageWithData:data];
    NSString *base64 = [self encodeToBase64String:image];

要将图像转换为base64字符串,请使用以下代码:

- (NSString *)encodeToBase64String:(UIImage *)image {
    return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}

该base64将为您提供完整图像。 用您给定的图像进行测试

这是base 64: https : //gist.github.com/anonymous/6d76e3ad852b4879ab097e6a1b3e68a2

关于它为何被切断的原因,我怀疑您正在查看调试器中的base64字符串,它将截断它。 实际上是NSLog字符串,您会看到它比调试器中看到的更长。

其他一些不相关的观察:

  1. 您不应将stringWithUTF8String[base64 bytes]一起使用,因为NSData不会以null终止。 如果确实需要将其转换为字符串,则可以使用initWithData而不是stringWithUTF8String

     return [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding]; 
  2. 正如其他人指出的那样,您可以完全绕开base64NSData的创建,并直接创建字符串:

     return [imageData base64EncodedStringWithOptions:0]; 
  3. 我不确定为什么要从服务器上获取NSData并通过UIImage往返运行它。 理论上,您可以直接对服务器中的数据进行编码:

     NSURL* imageUrl = [NSURL URLWithString:url]; NSData* urlData = [NSData dataWithContentsOfURL:imageUrl]; return [urlData base64EncodedStringWithOptions:0]; 

    服务器已经向您返回了PNG表示形式的NSData 您根本不需要做UIImageUIImagePNGRepresentation东西。 实际上,您生成的PNG远远大于服务器返回给您的PNG

  4. 我建议不要使用dataWithContentsOfURL ,因为这是一个同步网络调用。 您可能应该使用NSURLSession并将其更改为异步方法。

要将您的UIImage转换为base64字符串,可以使用此代码。

NSString *base64String =  [UIImagePNGRepresentation(uiImage) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

这是代码。

NSURL* imageUrl = [NSURL URLWithString:@"https://api.qrserver.com/v1/create-qr-code/?data=somedata&size=220x220&margin=0"];
NSData* urlData = [NSData dataWithContentsOfURL:imageUrl];
UIImage* uiImage = [UIImage imageWithData: urlData];

NSString *base64String =  [UIImagePNGRepresentation(uiImage) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

NSLog(@"%@",base64String);

我在http://codebeautify.org/base64-to-image-converter上检查了结果字符串

尝试一下,希望对您有所帮助。

这很正常

UIImage *img = [UIImage imageNamed:@"QRcode.png"];
NSString *base64 = [UIImagePNGRepresentation(img)base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSLog(base64);

可以在提供的URL中将打印的base64字符串转换回图像

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM