ImageCreateFromString и getimagesize в PHP - PullRequest
3 голосов
/ 08 января 2010

В настоящее время, если пользователь POST / загружает фотографию в мой скрипт PHP, я начинаю с некоторого кода, подобного этому

getimagesize($_FILES['picture1']['tmp_name']);

Затем я делаю ОЧЕНЬ больше вещей с этим, но я также пытаюсь получить фото с URL и обработать его другим существующим кодом, если смогу. Поэтому я хочу знать, я использую что-то вроде этого

$image = ImageCreateFromString(file_get_contents($url));

Смогу ли я затем запустить getimagesize () для моей переменной $ image?



ОБНОВЛЕНИЕ

Я только что попробовал это ...

$url = 'http://a0.twimg.com/a/1262802780/images/twitter_logo_header.png';
$image = imagecreatefromstring(file_get_contents($url));
$imageinfo = getimagesize($image);
print_r($imageinfo);

Но это не сработало, дал это.

Warning: getimagesize(Resource id #4) [function.getimagesize]: failed to open stream: No such file or directory in

Любая идея, как я могу сделать это или что-то подобное, чтобы получить результат, к которому я стремлюсь?

Ответы [ 4 ]

10 голосов
/ 08 января 2010

Я предлагаю вам придерживаться этого подхода:

// if you need the image type
$type = exif_imagetype($url);

// if you need the image mime type
$type = image_type_to_mime_type(exif_imagetype($url));

// if you need the image extension associated with the mime type
$type = image_type_to_extension(exif_imagetype($url));

// if you don't care about the image type ignore all the above code
$image = ImageCreateFromString(file_get_contents($url));

echo ImageSX($image); // width
echo ImageSY($image); // height

Использование exif_imagetype() намного быстрее, чем getimagesize(), то же самое относится к ImageSX() / ImageSY(), плюс они не возвращают массивы , и также может вернуть правильный размер изображения после например, изображение было изменено или обрезано.

Кроме того, использование getimagesize() в URL-адресах не годится, поскольку оно потребляет гораздо большую пропускную способность, чем альтернатива exif_imagetype() из Руководства по PHP :

Когда найдена правильная подпись, соответствующее постоянное значение будет в противном случае возвращается ЛОЖНЫЙ. Возвращаемое значение одинаково значение, которое getimagesize() возвращает в индекс 2, но exif_imagetype() это много быстрее.

Это потому, что exif_imagetype() будет считывать только первые несколько байтов данных.

1 голос
/ 08 января 2010

Если у вас уже есть ресурс изображения, вы получите размер, используя функции imagesx и imagesy.

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

Не уверен, поможет ли это, но я столкнулся с подобной проблемой, и оказалось, что брандмауэр, управляемый моим хостом, блокирует исходящее http-соединение с моего сервера.

Они изменили настройки брандмауэра. Мой код тогда работал.

Кстати: я думал, что это могло быть проблемой, когда я пытался file_get_contents () на нескольких URL, ни один из которых не работал!

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

getimagesize можно использовать с HTTP.

Имя файла - может ссылаться на локальный файл или (с учетом конфигурации) удаленный файл с использованием одного из поддерживаемых потоков .

Таким образом

$info = getimagesize($url);
$image = ImageCreateFromString(file_get_contents($url));

должно быть в порядке.

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