Почему данные изображения в словаре plist? - PullRequest
2 голосов
/ 16 января 2010

Я унаследовал код приложения OpenGL для iPhone, в котором есть несколько больших файлов PNG (скажем, sunshine.png, 10 000 px на 80 px) и соответствующий файл PLIST для каждого png (например, ImageData / sunshine.plist).

Проблема в том, что когда я заменяю PNG-файлы, приложение не получает их, по-видимому, потому, что оно на самом деле не читает PNG, а только соответствующие файлы данных изображения PLIST. Эти файлы plist сопоставлены с использованием библиотек OpenGL. Я подозреваю, что PLIST содержит некоторую двоичную кодировку каждой плитки, которая должна быть визуализирована, и что исходное изображение было разделено на плитки и каким-то образом сохранено в файле .plist. Проблема в том, что я понятия не имею, что значит заново генерировать новые файлы PLIST!

Я пытался сделать файл PLIST 0-байтовым или расшифровать их с помощью NSData с помощью UTF8Encoding, но получил только мусор. Подтвердили, что кодировка PVRTC не используется. Будем весьма благодарны за любые идеи о том, что означают эти файлы формата PLIST или откуда они берутся! Я не могу обновить это приложение, поскольку его основной функцией является отображение больших прокручиваемых изображений.

Вот формат файла sunshine.plist: (данные сокращены)

<dict><br> <key>0</key><br> <data><br> 12LXYpValWKVYtdilWLXYpVi12KVWpVi12KVWpVi12LXYtdilVqVYpVi12KVYtdilWLX YpValWLXYpValWLXYtdi12KVWpVilWLXYpVi12KVYtdilVqVYtdilVqVYtdi12LXYpVa... </data><br> <key>1</key><br> <data>...</data><br> </dict>

Вот как выглядит одно из значений словаря в редакторе списков Xcode: (данные сокращены)

<d762d762 955a9562 9562d762 9562d762 9562d762 955a9562 d762955a 9562d762 d762d762 955a9562 9562d762 9562d762 9562d762 955a9562 d762955a 9562d762 d762d762 955a9562 9562d762 9562d762 9562d762 955a9562 d762955a 9562d762 d762d762 955a9562 9562d762 9562d762 9562d762 955a9562 d762955a 9562d762 73ce31c6 31c673ce 73ce31c6 31c631c6 31c631c6 73ce31c6 31c673ce 31c631c6 73ce31c6 31c673ce 73ce31c6 31c631c6 31c631c6 73ce31c6 31c673ce 31c631c6 73ce31c6 31c673ce 73ce31c6 31c631c6 31c631c6 73ce31c6 31c673ce 31c631c6 73ce31c6 31c673ce 73ce31c6 31c631c6 31c631c6 73ce31c6 31c673ce 31c631c6 e5f6e7fe e5f6e5f6 a5f6e5fe e5fee7fe e7fee5f6 e5fee7fe e5f6e7fe ...>

Спасибо, сообщество StackOverflow!

Ответы [ 2 ]

3 голосов
/ 16 января 2010

Похоже, что оригинальный программист использовал что-то вроде ...

UIImage *anImage;
...
NSData *imgData=UIImagePNGRepresentation(anImage);

... затем они сохранили imgData в NSDictionary и записали его в файл.

Чтобы полностью изменить его, вам нужно загрузить словарь, а затем извлечь отдельные объекты данных. Тогда вы можете использовать создание изображений из данных, например, так:

NSDictionary *imgDict=[NSDictionary dictionaryWithContentsOfFile:plistFilePath];
NSData *imgData=[imgDict valueForKey:@"keyForImage"];
UIImage *newImg=[UIImage imageWithData:imgData];

UIImage может разобрать формат файла из данных. Ключами для изображений являются значения в листе <key>1</key>. Ключи являются NSStrings.

Если у вас есть UIImage, вы можете конвертировать его в другие форматы.


Edit01:

Вам может пригодиться: Программирование архивов и сериализации для какао

0 голосов
/ 16 января 2010

Может ли быть так, что предыдущий программист пропустил этап UIImage и использует NSData для хранения текстуры без дальнейшего кодирования? Потому что, когда я смотрю на поток словаря, который вы здесь написали, он выглядит как какой-то необработанный формат изображения. Кажется, он использует 16 бит (или, может быть, 32 бита ?!) на пиксель, но формат цвета, ширина и высота могут быть жестко закодированы (или, надеюсь, в словаре).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...