Compresser & enregistrer image en base64
Mon application reçoit des base64 fichiers d'image à partir du navigateur. J'ai besoin de les enregistrer sur le client. J'ai donc fait:
$data = base64_decode($base64img);
$fileName = uniqid() . '.jpg';
file_put_contents($uploadPath . $fileName, $data);
return $fileName;
Qui fonctionne très bien.
Maintenant, j'ai besoin de compresser & redimensionner l'image à max. 800 largeur & hauteur, le maintien de l'aspect ratio.
J'ai donc essayé:
$data = base64_decode($base64img);
$fileName = uniqid() . '.jpg';
file_put_contents($uploadPath . $fileName, $data);
return $fileName;
qui ne fonctionne pas (message d'erreur: "imagejpeg() s'attend à ce paramètre 1 pour être des ressources, chaîne de caractères donnée").
Et bien sûr, cela ne compresser, mais pas redimensionner.
Serait-il préférable d'enregistrer le fichier dans /tmp, le lire et de le redimensionner/déplacer via GD?
Grâce.
2ème partie
Grâce à @ontrack je sais maintenant que
$data = imagejpeg(imagecreatefromstring($data),$uploadPath . $fileName,80);
œuvres.
Mais maintenant, j'ai besoin de redimensionner l'image à un maximum de 800 de largeur et de hauteur. J'ai cette fonction:
function resizeAndCompressImagefunction($file, $w, $h, $crop=FALSE) {
list($width, $height) = getimagesize($file);
$r = $width / $height;
if ($crop) {
if ($width > $height) {
$width = ceil($width-($width*($r-$w/$h)));
} else {
$height = ceil($height-($height*($r-$w/$h)));
}
$newwidth = $w;
$newheight = $h;
} else {
if ($w/$h > $r) {
$newwidth = $h*$r;
$newheight = $h;
} else {
$newheight = $w/$r;
$newwidth = $w;
}
}
$src = imagecreatefromjpeg($file);
$dst = imagecreatetruecolor($newwidth, $newheight);
imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
return $dst;
}
J'ai donc pensé que je pouvais faire:
$data = imagejpeg(resizeAndCompressImagefunction(imagecreatefromstring($data),800,800),$uploadPath . $fileName,80);
qui ne fonctionne pas.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser imagecreatefromstring
Pour répondre à la deuxième partie:
$données ne contiennent soit true ou false pour indiquer si l'opération de imagejpeg a été un succès. Les octets sont dans
$uploadPath . $fileName
. Si vous voulez les octets de retour dans$data
vous devez utiliser un temporaire de la mémoire tampon de sortie: