我正在尝试将图片文件作为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字符串中的图像文件,以便我可以将它传递给图像解析库以获取原始像素数据。
我只是认为我所拥有的功能可以打开除图像之外的任何文件。
答案 0 :(得分:1)
如果您运行代码,则传递NSError
实例而不是nil
,
NSError *error = nil;
NSString *string = [NSString stringWithContentsOfFile:filePath
encoding:NSUTF8StringEncoding
error:&error];
你会看到stringWithContentsOfFile
无法打开图像文件,返回nil
并且给出的错误是:
错误域= NSCocoaErrorDomain代码= 261"无法完成操作。 (可可错误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)。