2010-04-13 5 views
6

Je veux être en mesure de récupérer une image distante d'un serveur Web, rééchantillonner, puis servir au navigateur et de l'enregistrer dans un fichier. Voici ce que j'ai jusqu'à présent:Obtenir l'image à distance en utilisant cURL puis ré-échantillonner

$ch = curl_init(); 

// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, "$rURL"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, 0); 

// grab URL and pass it to the browser 
$out = curl_exec($ch); 

// close cURL resource, and free up system resources 
curl_close($ch); 

$imgRes = imagecreatefromstring($out); 
imagejpeg($imgRes, $filename, 70); 

header("Content-Type: image/jpg"); 
imagejpeg($imgRes, NULL, 70); 
exit(); 

Mise à jour

à jour pour refléter réponse basée sur la discussion ci-dessous

Répondre

4

Vous pouvez récupérer le fichier dans une ressource GD en utilisant imagecreatefromstring():

imagecreatefromstring() retourne un identifiant d'image représentant l'image obtenue à partir des données. Ces types seront automatiquement détectés si votre version de PHP les supporte: JPEG, PNG, GIF, WBMP et GD2.

à partir de là, c'est assez simple en utilisant imagecopyresampled().

sortie à l'aide imagejpeg() ou quel que soit le format de sortie vous convient le mieux.

Faire une sortie avec un nom de fichier:

imagejpeg($image_resource, "/path/to/image.jpg"); 

puis envoyer la même ressource au navigateur:

header("Content-type: image/jpeg"); 
imagejpeg($image_resource); 

selon le format de l'image, vous pouvez utiliser la imagepng() ou fonctions imagegif() à la place.

Vous pouvez travailler avec différents formats de sortie en fonction du type de fichier d'entrée. Vous pouvez récupérer le type de fichier d'entrée en utilisant getimagesize().

Rappelez-vous que vous pouvez ajuster la qualité de l'image JPEG résultante en utilisant le paramètre $quality. La valeur par défaut est 75%, ce qui peut sembler assez merdique.

+0

Merci ... J'ai mis à jour ma question avec votre info ... Cela nécessite deux nouveaux échantillons de l'image que par opposition à un seul .. encore une fois, il semble inefficace. Quelle est la meilleure façon de faire cela? – Chris

+0

@Chris Deux rééchantillonnages de l'image? Pourquoi? Vous stockez la même ressource rééchantillonnée dans le fichier jpeg et le servez. Pourquoi feriez-vous le rééchantillonnage deux fois? –

+0

Désolé, j'ai mal interprété ce que vous avez écrit. J'ai mis à jour le code dans ma question. Il crée le jpeg une fois avec une qualité inférieure. Vraisemblablement, cela suffit à réduire la taille du fichier? Après cela, je l'enregistre dans le fichier, mais pour le servir, je dois alors relire le fichier, puis-je le stocker temporairement en mémoire ou est-ce un surcoût négligeable? – Chris

Questions connexes