我正在尝试将图像文件作为 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/