You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 02:45:08