iOS:某些文件无法打开

标签 ios

我正在尝试将图像文件作为 NSString 加载,但使用以下代码,所有图像文件都会出现nil:

NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithUTF8String:name.data()] ofType:nil];

NSString *da = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

我能够加载许多文件,但所有 JPEG 和 PNG 文件由于某种原因都会失败。我认为可能与编码有关,所以我将其切换为usedEncoding,但仍然不起作用。

我错过了什么?

编辑:

我一直在用 C++ 制作一个 iOS/Android 跨平台 OpenGL 图形库。除了纹理加载之外,一切正常。从磁盘加载的任何文件都会经过系统之间抽象的一个函数。我需要 STL 字符串中的图像文件,以便我可以将其传递到图像解析库以获取原始像素数据。

我只是认为我的功能可以打开除图像之外的任何文件,这有点简化。

最佳答案

如果你运行你的代码,传递一个 NSError 实例而不是 nil

NSError *error = nil;
NSString *string = [NSString stringWithContentsOfFile:filePath
                                             encoding:NSUTF8StringEncoding
                                                error:&error];

你会看到stringWithContentsOfFile无法打开图像文件,返回nil,给出的错误是:

Error Domain=NSCocoaErrorDomain Code=261 "The operation couldn’t be completed. (Cocoa error 261.)"...

Cocoa 错误 261 是 NSFileReadInapplicableStringEncodingError 这意味着文件的编码与您传递的编码不同 (NSUTF8StringEncoding)。但我已经尝试过其他编码,但都不适用于 PNG 文件。

您仍然可以通过将文件加载为 UIImage 然后将 UIImage 转换为 Base64 字符串来实现您想要的效果。

  • iOS 7 以来,这更容易,因为您可以使用内置方法 base64EncodedStringWithOptions:

    // Load the image and convert it to NSData
    UIImage *image = [UIImage imageNamed:@"yourImageName"];    
    NSData *imageData = UIImagePNGRepresentation(image);
    // You can use the equivalent UIImageJPEGRepresentation() for JPEG images
    
    // Convert NSData to a Base64 NSString
    NSString *base64ImageString = [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    
  • iOS 7 之前,您可以做完全相同的事情,但您必须实现自己的 Base64 编码方法(或导入许多已经可用,例如 nicklockwood/Base64 )。

关于iOS:某些文件无法打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29332402/

相关文章:

iOS 11 服务器交互

ios - 如何用swift制作单选按钮?

ios - 什么时候使用?、!、无或惰性?

iphone - 显示蜂窝数据已关闭警报

ios - 无法确定谁可以使用内部开发安装 iOS 应用程序?

iphone - 自动引用计数 (ARC) 对内存泄漏的影响

ios - 异步 block 的推荐设计模式?

ios - Swift UIPanGestureRecognizer仅从右到左

ios - 搜索栏取消按钮委托(delegate)未调用

objective-c - Core Plot 绘制一条直的 y 轴线,标签在顶部