2009-09-23 15 views
0

J'ai un formulaire de téléchargement d'image, l'utilisateur attache un fichier de visée et sélectionne la taille de l'image pour redimensionner le fichier image téléchargé (200kb, 500kb, 1mb, 5mb, Original). Par exemple, l'utilisateur télécharge l'image avec une taille de 1 Mo, et si l'utilisateur sélectionne 200 Ko pour redimensionner, alors mon script devrait l'enregistrer avec une taille de 200kb.Comment redimensionner le fichier image en tailles optionnelles

Quelqu'un sait ou a une expérience sur la tâche similaire?

Merci pour votre réponse à l'avance.

Répondre

5

Avec le GD library, utilisez imagecopyresampled().

<?php 
// The file 
$filename = 'test.jpg'; 
$percent = 0.5; 

// Content type 
header('Content-type: image/jpeg'); 

// Get new dimensions 
list($width, $height) = getimagesize($filename); 
$new_width = $width * $percent; 
$new_height = $height * $percent; 

// Resample 
$image_p = imagecreatetruecolor($new_width, $new_height); 
$image = imagecreatefromjpeg($filename); 
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height); 

// Output 
imagejpeg($image_p, null, 100); 
?> 

Edit: Si vous voulez redimensionner le fichier d'image à une taille spécifiée, qui est un peu plus difficile. Tous les principaux formats d'image utilisent des taux de compression et de compression qui varient selon la nature de ce qui est compressé. Compressez ciel bleu clair et vous obtiendrez un meilleur taux de compression que vous ne serez la mer des gens. Le meilleur que vous pouvez faire est d'essayer une taille particulière est d'essayer une taille particulière et de voir ce que la taille du fichier est, en ajustant si nécessaire.

Resize ratio = desired file size/actual file size 
Resize multipler = square root (resize ratio) 
New height = resize multiplier * actual height 
New width = resize multiplier * actual width 

Ceci tient essentiellement compte d'une approximation du taux de compression attendu. Je m'attendrais à ce que vous ayez une certaine tolérance (comme +/- 5%) et vous pouvez modifier les chiffres si nécessaire.

Il n'existe aucun moyen direct de redimensionner à une taille de fichier particulière. Enfin, j'ajouterai que le redimensionnement à une taille de fichier particulière est plutôt inhabituel. Le redimensionnement à une hauteur et/ou une largeur particulière (maintien du rapport d'aspect) est beaucoup plus commun et attendu (par les utilisateurs).

Mise à jour: correctement signalé, la taille du fichier est erronée. Le ratio doit être la racine carrée des ratios de taille de fichier lorsque vous l'appliquez deux fois (une fois à la hauteur, une fois à la largeur).

+0

Vous obtiendrez des fichiers de la moitié de la taille souhaitée, car le "ratio de redimensionnement" des composants fractionnaires est mis au carré. Si vous avez une image de 1Mo et que vous voulez un fichier (environ) 512KB, vous voulez le redimensionner pour que newheight = sqrt (2) * hauteur (de même pour la largeur) – dcrosta

+0

Merci pour vos commentaires utiles – taras

+0

@dcrosta: tout à fait raison. Fixé à mltiply par sqrt (ratio). – cletus

2

Utilisation de la bibliothèque GD fourni en PHP:

// $img is the image resource created by opening the original file 
// $w and $h is the final width and height respectively. 
$width = imagesx($img);$height = imagesy($img); 
$ratio = $width/$height; 

if($ratio > 1){ 
// width is greater than height 
$nh = $h; 
$nw = floor($width * ($nh/$height)); 
}else{ 
$nw = $w; 
$nh = floor($height * ($nw/$width)); 
} 

//centralize image 
$nx = floor(($nw- $w)/2.0); 
$ny = floor(($nh-$h)/2.0); 

$tmp2 = imagecreatetruecolor($nw,$nh); 
imagecopyresized($tmp2, $img,0,0,0,0,$nw,$nh,$width,$height); 

$tmp = imagecreatetruecolor($w,$h); 
imagecopyresized($tmp, $tmp2,0,0,$nx,$ny,$w,$h,$w,$h); 

imagedestroy($tmp2);imagedestroy($img); 

imagejpeg($tmp, $final_file); 

Ce morceau de code prendra l'image originale, redimensionner aux dimensions spécifiées. Il va d'abord essayer de redimensionner l'image, puis recadrer + centraliser l'image, la faisant ainsi tomber dans les dimensions indiquées.

+0

je voulais redimensionner la taille du fichier image, pas la taille de l'image elle-même, par exemple, l'utilisateur télécharge l'image avec une taille de 1mb, et si l'utilisateur sélectionne 200 Ko pour redimensionner, mon script devrait l'enregistrer avec 200kb taille. – taras

+0

comme l'autre réponse, s'il n'y a pas de réponse définitive de combien de taille de fichier il sera après l'enregistrement. – mauris