Можно перейти непосредственно в Objective C со следующими преимуществами:
, По крайней мере, для меня легче выучить новый язык, когда я интересуюсь некоторым определенным приложением или образцом, и я перестал работать, когда я должен изучить другую вещь, которая не является точно, на чем мне интересно.
можно всегда совершенствовать знание C позже, если Вы заинтересованы более низким программированием уровня.
Данные XMP буквально встроены в файл изображения, поэтому их можно извлечь с помощью строковых функций PHP из самого файла изображения.
Ниже показана эта процедура (я использую SimpleXML , но любой другой XML API или даже простой и умный синтаксический анализ строки может дать вам такие же результаты):
$content = file_get_contents($image);
$xmp_data_start = strpos($content, '<x:xmpmeta');
$xmp_data_end = strpos($content, '</x:xmpmeta>');
$xmp_length = $xmp_data_end - $xmp_data_start;
$xmp_data = substr($content, $xmp_data_start, $xmp_length + 12);
$xmp = simplexml_load_string($xmp_data);
Всего два замечания:
file_get_contents ()
, поскольку эта функция загружает все изображение в память . Использование fopen ()
для открытия ресурса файлового потока и проверка блоков данных на наличие ключевых последовательностей и x: xmpmeta>
значительно сократит объем памяти.
Я отвечаю на это только спустя столько времени, потому что это лучший результат при поиске в Google того, как анализировать данные XMP. Я несколько раз видел, как этот почти идентичный фрагмент кода использовался в коде, и это ужасная трата памяти. Вот пример метода fopen (), который Стефан упоминает после своего примера.
<?php
function getXmpData($filename, $chunkSize)
{
if (!is_int($chunkSize)) {
throw new RuntimeException('Expected integer value for argument #2 (chunkSize)');
}
if ($chunkSize < 12) {
throw new RuntimeException('Chunk size cannot be less than 12 argument #2 (chunkSize)');
}
if (($file_pointer = fopen($filename, 'r')) === FALSE) {
throw new RuntimeException('Could not open file for reading');
}
$startTag = '<x:xmpmeta';
$endTag = '</x:xmpmeta>';
$buffer = NULL;
$hasXmp = FALSE;
while (($chunk = fread($file_pointer, $chunkSize)) !== FALSE) {
if ($chunk === "") {
break;
}
$buffer .= $chunk;
$startPosition = strpos($buffer, $startTag);
$endPosition = strpos($buffer, $endTag);
if ($startPosition !== FALSE && $endPosition !== FALSE) {
$buffer = substr($buffer, $startPosition, $endPosition - $startPosition + 12);
$hasXmp = TRUE;
break;
} elseif ($startPosition !== FALSE) {
$buffer = substr($buffer, $startPosition);
$hasXmp = TRUE;
} elseif (strlen($buffer) > (strlen($startTag) * 2)) {
$buffer = substr($buffer, strlen($startTag));
}
}
fclose($file_pointer);
return ($hasXmp) ? $buffer : NULL;
}
Я разработал расширение Xmp Php Tookit: это расширение php5, основанное на наборе инструментов adobe xmp, который предоставляет основные классы и методы для чтения/записи/разбора метаданных xmp из jpeg, psd, pdf, видео, аудио.... Это расширение работает под лицензией gpl. Скоро выйдет новый релиз для php 5.3 (сейчас совместим только с php 5.2.x) и будет доступен на windows и macosx (сейчас только для freebsd и linux систем). http://xmpphptoolkit.sourceforge.net/