【问题标题】:How to serialize NSImage to an sql script in order to import it in a blob column?如何将 NSImage 序列化为 sql 脚本以便将其导入 blob 列?
【发布时间】:2011-04-26 15:13:42
【问题描述】:

我的 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 列?

【问题讨论】:

标签: objective-c string serialization nsdata


【解决方案1】:

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

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

【讨论】:

  • 嘿尼克,谢谢你的回答。它帮助我找到了解决问题的方法。
【解决方案2】:

您需要使用 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)?

您还可以使用UIImagePNGRepresentationUIImagePNGRepresentation 函数,如果这些格式适合您,它们会直接返回NSData 对象。会简单很多。

然后使用NSDatabytes方法获得指向图像数据的指针(const void *)。

【讨论】:

    【解决方案3】:

    我找到了将图像序列化为 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,但在数据库中,图像将是 200kb。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2013-10-24
      • 2021-05-29
      • 2013-10-08
      • 2011-02-01
      相关资源
      最近更新 更多