解码为 png 的 Base64 字符串被 Objective-C 截断
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]];
图片url: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 字符串?
要将您的 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
上检查了结果字符串
尝试一下,希望对您有所帮助。
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
字符串,您会发现它比您在调试器中看到的要长。
其他一些不相关的观察结果:
您不应将 stringWithUTF8String
与 [base64 bytes]
一起使用,因为 NSData
不会以空值终止。如果你真的需要将它转换成一个字符串,你会使用 initWithData
而不是 stringWithUTF8String
:
return [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding];
正如其他人所指出的,您可以完全绕过 base64
的 NSData
的创建,直接创建字符串:
return [imageData base64EncodedStringWithOptions:0];
我完全不确定您为什么要从服务器获取 NSData
并通过 UIImage
来回传输它。理论上您可以直接对来自服务器的数据进行编码:
NSURL* imageUrl = [NSURL URLWithString:url];
NSData* urlData = [NSData dataWithContentsOfURL:imageUrl];
return [urlData base64EncodedStringWithOptions:0];
服务器已经返回给您 NSData
的 PNG 格式。你根本不需要做那些 UIImage
和 UIImagePNGRepresentation
的事情。您实际生成的 PNG
比服务器返回给您的要大得多。
我建议不要使用 dataWithContentsOfURL
,因为那是同步网络调用。您可能应该使用 NSURLSession
并将其更改为异步方法。
这很完美
UIImage *img = [UIImage imageNamed:@"QRcode.png"];
NSString *base64 = [UIImagePNGRepresentation(img)base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSLog(base64);
在您提供的URL
中,可以将打印的 base64 字符串转换回图像
我正在使用此代码将从 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]];
图片url: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 字符串?
要将您的 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
上检查了结果字符串尝试一下,希望对您有所帮助。
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
字符串,您会发现它比您在调试器中看到的要长。
其他一些不相关的观察结果:
您不应将
stringWithUTF8String
与[base64 bytes]
一起使用,因为NSData
不会以空值终止。如果你真的需要将它转换成一个字符串,你会使用initWithData
而不是stringWithUTF8String
:return [[NSString alloc] initWithData:base64 encoding:NSUTF8StringEncoding];
正如其他人所指出的,您可以完全绕过
base64
的NSData
的创建,直接创建字符串:return [imageData base64EncodedStringWithOptions:0];
我完全不确定您为什么要从服务器获取
NSData
并通过UIImage
来回传输它。理论上您可以直接对来自服务器的数据进行编码:NSURL* imageUrl = [NSURL URLWithString:url]; NSData* urlData = [NSData dataWithContentsOfURL:imageUrl]; return [urlData base64EncodedStringWithOptions:0];
服务器已经返回给您
NSData
的 PNG 格式。你根本不需要做那些UIImage
和UIImagePNGRepresentation
的事情。您实际生成的PNG
比服务器返回给您的要大得多。我建议不要使用
dataWithContentsOfURL
,因为那是同步网络调用。您可能应该使用NSURLSession
并将其更改为异步方法。
这很完美
UIImage *img = [UIImage imageNamed:@"QRcode.png"];
NSString *base64 = [UIImagePNGRepresentation(img)base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
NSLog(base64);
在您提供的URL
中,可以将打印的 base64 字符串转换回图像