如何将NSImage序列化为sql脚本以便在blob列中导入它?

时间:2011-04-19 15:00:03

标签: objective-c string serialization nsdata

我的iphone应用程序使用SQLite数据库来存储数据。我有一个带有blob列的表,我可以存储我的图像。

当我做更新时,我不想覆盖用户的数据库,我想执行一些sql脚本并在需要时注入新数据。

我有一个为Mac制作的实用程序应用程序应该生成将在iphone上运行的sql脚本。

我在我的应用程序中将图像存储为NSImages,但是当我想将数据导出为sql脚本(简单文本文件)时,我遇到了问题。

我的文件应该包含以下行:

Insert into Images(imageData) values ( ___IMAGE1_DATA___ );
Insert into Images(imageData) values ( ___IMAGE2_DATA___ );
Insert into Images(imageData) values ( ___IMAGE3_DATA___ );

问题是如何将图像数据序列化到我的sql脚本以便将数据正确导入blob列?

3 个答案:

答案 0 :(得分:1)

您可以使用NSImage的TIFFRepresentation来获取NSData表示。

实际上我会将图像保存到磁盘并仅从您的sqlite数据库中引用它们。当您的图片往往很大时,这可以提高性能。

答案 1 :(得分:0)

您需要使用UIImage的CGImage方法获取基础CGImage对象。然后看一下CGImage参考:

http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Reference/CGImage/Reference/reference.html

然后使用CGContextRef对象绘制图像,并获取像素数据。

StackOverflow上有一个很好的例子:

How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?

如果这些格式适合您,您还可以使用直接返回UIImagePNGRepresentation对象的UIImagePNGRepresentationNSData函数。这将简单得多。

然后使用bytes的{​​{1}}方法指定图像数据(NSData)。

答案 2 :(得分:0)

我找到了一个解决方案,将图像序列化为sql脚本,然后将它们插入db(blob列)。

我从像NSData *thumbailData = [thumbnail TIFFRepresentation];这样的图像中提取NSData(感谢Nick)。

在我提取NSData之后,我使用下面的方法将其转换为十六进制字符串。我将它添加到NSData类别中。

- (NSString*) hexString {
    NSMutableString *stringBuffer = [NSMutableString
                                     stringWithCapacity:([self length] * 2)];
    const unsigned char *dataBuffer = [self bytes];
    int i;

    for (i = 0; i < [self length]; ++i)
        [stringBuffer appendFormat:@"%02x", (unsigned long)dataBuffer[ i ]];

    return [[stringBuffer copy] autorelease];
}

NSString *hexRepresentation = [thumbnailData hexString];

hexRepresentation将如下所示:

  

4d4d002a00005a48fafafafff8f8f8fff8f8f8fff9f9f9fff8f8f8fff8f8f8   ...

为了序列化图像的hexRepresentation,我创建了一个如下所示的SQL脚本:

INSERT INTO Thumbnails (Picture_uid, Thumbnail) Values(10, x'4d4d002a00005a48fafafafff8f8f8fff8f8f8fff9f9f9fff8f8f8fff8f8f8 … ‘) ; 
x'数据'告诉数据库它将以十六进制格式接收信息,并且知道如何处理它。

此解决方案的一个问题是它会使脚本的大小加倍。如果你有200kb的图像,脚本将有400kb,但在db中,图像将是200kb。

对我来说,这是一个很好的解决方案,可以使用sql脚本更新我的数据库,而无需编写任何代码。