Как сериализовать NSImage к сценарию sql, чтобы импортировать его в столбец BLOB-объектов? - PullRequest
0 голосов
/ 19 апреля 2011

Мое приложение iphone использует базу данных SQLite для хранения данных. У меня есть таблица со столбцом BLOB-объектов, где я храню свои изображения.

Когда я делаю обновление, я не хочу перезаписывать базу данных пользователя, я хочу выполнять некоторые сценарии sql и вставлять новые данные, если это необходимо.

У меня есть служебное приложение для Mac, которое должно создавать сценарии sql, которые будут запускаться на iphone.

У меня есть изображения, хранящиеся в виде 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 ]

1 голос
/ 19 апреля 2011

Вы можете использовать TIFFRepresentation NSImage, чтобы получить представление NSData.

На самом деле я хотел бы сохранить изображения на диск и ссылаться на них только из вашей базы данных sqlite. Это может улучшить производительность, когда ваши изображения имеют тенденцию быть большими.

0 голосов
/ 26 апреля 2011

Я нашел решение сериализовать изображения в сценарий sql и затем вставить их в db (столбец blob).

Я извлекаю NSData из изображения, подобного этому NSData *thumbailData = [thumbnail TIFFRepresentation]; (спасибо Ник).

После того, как я извлекаю 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];

Представление hexRepretation будет выглядеть так:hexRepresentation изображения я создал сценарий SQL, как показано ниже:

INSERT INTO Thumbnails (Picture_uid, Thumbnail) Values(10, x'4d4d002a00005a48fafafafff8f8f8fff8f8f8fff9f9f9fff8f8f8fff8f8f8 … ‘) ; 

x ' data ' сообщает БД, что он получит информацию в шестнадцатеричном форматеон будет знать, как с этим справиться.

Одна из проблем этого решения заключается в том, что он удвоит размер сценария.если у вас будет изображение размером 200 КБ, сценарий будет иметь 400 КБ, но в БД изображение будет 200 КБ.

для меня это было бы хорошим решением обновить мою БД с использованием сценариев sql без написания какого-либо кода.

0 голосов
/ 19 апреля 2011

Вам нужно будет получить базовый CGImage объект, используя CGImage метод UIImage.Затем взгляните на ссылку CGImage:

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

Затем используйте объект CGContextRef, чтобы нарисовать изображение и получить данные пикселей.

ЕстьХороший пример StackOverflow:

Как получить данные пикселей из UIImage (Cocoa Touch) или CGImage (Core Graphics)?

Вы также можете использовать UIImagePNGRepresentationили UIImagePNGRepresentation функции, которые возвращают непосредственно NSData объект, если эти форматы вам подходят.Это будет намного проще.

Затем используйте метод bytes из NSData, чтобы получить указатель на данные изображения (const void *).

...