Objective-C如何将captureOutput返回的AVCapturePhoto转为字符串存入JSON
问题根因
- JPEG属于二进制数据,本身不符合UTF-8、UTF-16等纯文本编码规则,直接调用
initWithData:encoding:转换必然返回nil,这是你获取空值的核心原因。 - Swift中
jpegData(compressionQuality:)对应的Objective-C API就是你已经用到的UIImageJPEGRepresentation(),该接口本身没有问题,错误出在后续转字符串的逻辑。 NSUserDefaults原生支持NSData类型存储,不需要强行将图片二进制转成字符串存储,属于多余操作。
修复方案
1. 调整拍摄存储逻辑
删除无效的二进制转字符串逻辑,直接将JPEG数据存入NSUserDefaults:
- (void)captureOutput:(AVCapturePhotoOutput *)output didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(NSError *)error { if (error != nil){ NSLog(@"Error in capture process: %@", error.debugDescription); return; } NSData *imageData = [photo fileDataRepresentation]; if (!imageData) { NSLog(@"unable to create image data"); return; } // 等价于Swift的UIImage().jpegData(compressionQuality: 0.0) NSData *jpegData = UIImageJPEGRepresentation([[UIImage alloc] initWithData:imageData], 0.0); if (!jpegData) { NSLog(@"fail to convert to jpeg data"); return; } // 直接存NSData到NSUserDefaults NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:jpegData forKey:@"photo"]; [defaults synchronize]; // 手动同步避免数据丢失 }
2. 取值拼JSON发服务端逻辑
服务端通常接受Base64编码的图片字符串,取数据后转Base64即可放入字典/JSON:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *savedJpegData = [defaults objectForKey:@"photo"]; if (savedJpegData) { // 二进制转Base64字符串,可直接用于网络请求 NSString *photoBase64Str = [savedJpegData base64EncodedStringWithOptions:0]; NSMutableDictionary *requestParams = [NSMutableDictionary new]; requestParams[@"photo"] = photoBase64Str; // 后续调用网络接口发送请求即可 }
内容的提问来源于stack exchange,提问作者Jo Momma
相关产品推荐
相关产品推荐

