Discussion:
[pour test et correction] Upload images
(trop ancien pour répondre)
SAM
2009-10-07 08:32:44 UTC
Permalink
Salutatous,

Alors voici, après mes premiers déboires(*), je pense que j'approche de
qque chose qui pourrait tenir la route.
(en moins de 200 lignes, commentaires, vides et html compris)

Pour essayer c'est ici :
<http://je.m.arrete.free.fr/photos_upload/>
Essayez tt de même de ne pas faire trop fort, Free est qque fois
pointilleux vis à vis de ce qu'on y bricole :-(
Je supprime cet essai ce vendredi ainsi que vos uploads qui seraient passés.

Pour le code c'est là :
<http://je.m.arrete.free.fr/photos_upload/sam_upload.txt>
Merci de bien vouloir vous y pencher et de me faire vos remarques.

J'ai mis un bout de code qui m'est incompréhensible pour allouer la
mémoire soi-disant nécessaire aux opérations de redimensionnements.
(si Free l'autorise ?)

Je n'ai pas contrôlé les fichiers par la méthode exif.

Je n'ai pas utilisé de classe comme Marc le proposait (je n'ai pas bp
regardé son code non plus, préférant tourner ma sauce moi-même, mais je
le ferai bientôt).
À propos, la classe est appelée par require_once m'a t-il semblé.
Faudra que je vois la diff d'avec include.

Voilà.
à ++

(*) post : Verification upload photos par formulai re
--
sm
Alex Vaure
2009-10-07 10:15:49 UTC
Permalink
Post by SAM
<http://je.m.arrete.free.fr/photos_upload/>
Essayez tt de même de ne pas faire trop fort, Free est qque fois
pointilleux vis à vis de ce qu'on y bricole :-(
Bon, ben, ça a l'air de marcher...
Je viens d'y poser une photo sans problème, par contre, pourquoi y a
deux fois la photo, et pourquoi y'a ce texte dessous : "Erreur #0 = tout
est OK"
--
Alex
Vous avez beau dire, y'a pas seulement que de la pomme, y'a aut'chose.
Ça serait pas dès fois de la betterave, hein ?
SAM
2009-10-07 12:08:18 UTC
Permalink
Post by Alex Vaure
Post by SAM
<http://je.m.arrete.free.fr/photos_upload/>
Essayez tt de même de ne pas faire trop fort, Free est qque fois
pointilleux vis à vis de ce qu'on y bricole :-(
Bon, ben, ça a l'air de marcher...
Je viens d'y poser une photo sans problème, par contre, pourquoi y a
Le test est surtout pour les fichiers qui ne sont pas des images
et surtout ceux qui tenteraient de se faire passer pour une image,
les 2 devant être refusés, de préf avant réel upload.
Post by Alex Vaure
deux fois la photo, et pourquoi y'a ce texte dessous : "Erreur #0 = tout
est OK"
Ben ...
- le gars il envoie sa photo (3200/2400 <2Mo)
- le truc la vérifie (objet du test et corrigés)
- le truc la resize en 600/480 et sauve celle-là
- le truc la resize en 200/150 et sauve celle-là
- le truc efface l'uploadé
- le truc affiche donc la grande vue et sa vignette pour contrôle
(bientôt l'ajout de suppression/remplacement des vues si !ok)
- le truc réaffirme que pas d'erreur tout est OK

Bon, faut pas trop se prendre la tête avec les affichages textuels,
c'est plutôt pour du débogage à l'heure actuelle.
Y a même pas de css pour faire joli.

Si on coche la case et valide ça affiche l'ensemble des vignettes
enregistrées, pas besoin d'uploader qque chose dans ce cas.
Le clic sur une des diapos montrées affiche (en JavaScript ça m'est +
facile) la grande vue.

Pour l'heure les images sont pas trop moches ;-)
Merci.

Me reste à voir si on peut (facilement ?) transformer un png en jpg.
Les png ou gif avec transparence n'ont aucun intérêt pour le résultat
espéré, et il me semble que les jpg fatiguent moins et le serveur et les
brouteurs.
--
sm
CrazyCat
2009-10-07 10:15:49 UTC
Permalink
Post by SAM
J'ai mis un bout de code qui m'est incompréhensible pour allouer la
mémoire soi-disant nécessaire aux opérations de redimensionnements.
(si Free l'autorise ?)
Ton bout de code est compréhensible :) En fait, c'est le calcul du poids
de l'image (nombres de pixels * bits par pixel * nombre de canaux de
l'image) divisé par 8 (pour avoir en octets et non pas en bits).
J'ai une petite interrogation sur le pow(2,16), mais ça doit avoir sa
raison :)
La multiplication par 1.65 doit être pour avoir une marge valable.
Post by SAM
Je n'ai pas contrôlé les fichiers par la méthode exif.
Toutes les images n'ayant pas forcément des infos exif (je crois), ce
n'est pas plus mal.
Post by SAM
Je n'ai pas utilisé de classe comme Marc le proposait (je n'ai pas bp
regardé son code non plus, préférant tourner ma sauce moi-même, mais je
le ferai bientôt).
Oui, ce serait mieux.
Post by SAM
À propos, la classe est appelée par require_once m'a t-il semblé.
Faudra que je vois la diff d'avec include.
La différence est au niveau des erreurs d'inclusion. Un require produit
une erreur fatale (E_ERROR) alors qu'include provoque une alerte
(E_WARNING).

La seule critique que je te ferais, c'est de ne pas séparer ton html de
ton php, et surtout de mettre une fonction en plein milieu :)
--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
SAM
2009-10-07 14:49:00 UTC
Permalink
Post by CrazyCat
Post by SAM
J'ai mis un bout de code qui m'est incompréhensible pour allouer la
mémoire soi-disant nécessaire aux opérations de redimensionnements.
(si Free l'autorise ?)
Ton bout de code est compréhensible :) En fait, c'est le calcul du poids
de l'image (nombres de pixels * bits par pixel * nombre de canaux de
l'image) divisé par 8 (pour avoir en octets et non pas en bits).
Je sais lire une multiplication ;-)
Mais d'où sort ce calcul ?

Est-ce que ça peut impressionner Free ?
(qu'il alloue + de mémoire si besoin)
Faudrait avoir une grande image de poids <=2Mo à essayer.
Je viens d'essayer avec un jpg de 1,9Mo,
résultat :
Mémoire utilisée : 21679522 contre 129816
est-ce à dire que la mémoire de base est de 129816
et que là ça a demandé (et obtenu) 21679522
?
Post by CrazyCat
Post by SAM
Je n'ai pas contrôlé les fichiers par la méthode exif.
Toutes les images n'ayant pas forcément des infos exif (je crois), ce
n'est pas plus mal.
C'est un peu mon sentiment aussi.
Faut juste que je sois certain que
getimagesize()
élimine vraiment tout fichier non image.
Et que ça marche sur le fichier temporaire.
Car après les contrôles par redimensionnement se font sur un vrai fichier.
Arggh! je crois avoir oublié de l'effacer si les redimensionnements
échouent.
enfin ... si mon truc de résultat de ceux-ci tient la route ?!
($ok1 et $ok2)

Par contre, et pour revenir sur les histoires de mémoire,
lors d'1 de mes essais avec un png, Free m'a gueulé à l'arnaque de
mémoire ;-(
Je n'ai pas eu ce pb avec des jpg.
Les png, c'est sûr que c'est plus lourd à bouger, surtout que j'essaie
de les compresser au max au passage.
Je vais peut-être supprimer cette option, non?
(GaphicConverteur prend 50% de mon CPU et qques mns à traiter ça, je
suppose qu'un serveur aussi a besoin de ressources, que le temps
d'attente va être dépassé)
Bon! mon jpg de 1,9Mo GC l'a passé en png de 8Mo ! Super :-(
Post by CrazyCat
Post by SAM
Je n'ai pas utilisé de classe comme Marc le proposait (je n'ai pas bp
regardé son code non plus, préférant tourner ma sauce moi-même, mais
je le ferai bientôt).
Oui, ce serait mieux.
C'est mieux une classe ?
Faut que je pense à me renseigner alors.
Une piste ?
Post by CrazyCat
La seule critique que je te ferais, c'est de ne pas séparer ton html de
ton php, et surtout de mettre une fonction en plein milieu :)
Là c'est pour avoir tout dans le même fichier.
Ben ... ça essaie de suivre un ordre logique.
Et puis, dans le html pourquoi pas ?
C'est bien séparé, presque tt le php d'un bloc.
Il y a bien assez à scroller dans les 90 lignes de php sans en plus
remonter avant le head.

Mébon, bien sûr ça ne va pas rester comme ça, c'est pour le test et les
corrigés de fonctions de contrôles et sauvegarde.

Merci d'être passé.
--
sm
CrazyCat
2009-10-07 19:12:41 UTC
Permalink
Post by SAM
Post by CrazyCat
Ton bout de code est compréhensible :) En fait, c'est le calcul du
poids de l'image (nombres de pixels * bits par pixel * nombre de
canaux de l'image) divisé par 8 (pour avoir en octets et non pas en
bits).
Je sais lire une multiplication ;-)
Mais d'où sort ce calcul ?
C'est le calcul "normal", qui est très bien expliqué sur
<http://www.galerie-photo.com/resolution.html>
Post by SAM
Est-ce que ça peut impressionner Free ?
Il est possible que free l'autorise dans une certaine mesure, il faut
faire des tests.
Post by SAM
Faut juste que je sois certain que
getimagesize()
élimine vraiment tout fichier non image.
Et que ça marche sur le fichier temporaire.
getimagesize() fonctionne aussi avec les swf. Il n'y a normalement aucun
souci pour travailler sur les fichiers temporaires.
Post by SAM
Post by CrazyCat
Post by SAM
Je n'ai pas utilisé de classe comme Marc le proposait (je n'ai pas bp
regardé son code non plus, préférant tourner ma sauce moi-même, mais
je le ferai bientôt).
Oui, ce serait mieux.
C'est mieux une classe ?
Faut que je pense à me renseigner alors.
Une piste ?
J'avais commencé à en coder une, mais il faudrait que je l'achève enfin :)

Tu peux peut-être regarder du côté de
<http://mambo-developer.org/api/nav.html?mambots/editors/mostlyce/jscripts/tiny_mce/imagemanager/Classes/ImageManager.php.html>
pour t'inspirer.
Post by SAM
Post by CrazyCat
La seule critique que je te ferais, c'est de ne pas séparer ton html
de ton php, et surtout de mettre une fonction en plein milieu :)
Là c'est pour avoir tout dans le même fichier.
Ben ... ça essaie de suivre un ordre logique.
Et puis, dans le html pourquoi pas ?
C'est bien séparé, presque tt le php d'un bloc.
Oui, c'est effectivement facile à suivre, pour le test de fonctionnement :)
--
Réseau IRC Francophone: http://www.zeolia.net
Aide et astuces : http://www.g33k-zone.org
Communauté Francophone sur les Eggdrops: http://www.eggdrop.fr
Alarch
2009-10-08 11:15:39 UTC
Permalink
Post by CrazyCat
Post by SAM
Post by CrazyCat
Post by SAM
Je n'ai pas utilisé de classe comme Marc le proposait (je n'ai pas bp
regardé son code non plus, préférant tourner ma sauce moi-même, mais
je le ferai bientôt).
Oui, ce serait mieux.
C'est mieux une classe ?
Faut que je pense à me renseigner alors.
Une piste ?
J'avais commencé à en coder une, mais il faudrait que je l'achève enfin :)
Je peux te passer ma classe si tu veux, elle est un peu commentée mais
peut-être pas assez, elle n'était pas prévue pour "diffusion", mais ça
pourrait te fournir une base de départ. Si ça t'intéresse écris-moi en
privé que je t'envoie le fichier. Bien entendu j'essayerai de bien
t'expliquer comment l'utiliser, elle fait partie d'une sorte de "framework"
maiso, donc il faudra ajuster un ou deux trucs, mais elle devrait
fonctionner avec peu de règlages.
SAM
2009-10-09 09:56:17 UTC
Permalink
Tiens, au fait, puisque tu as l'air de t'y connaitre, comment réalise
t-on un jpeg qui s'affiche dans un brouteur d'abord dégueu puis qui
progressivement s'améliore ? (fabrication en php s'entend)
Là les jpeg uploadés lourds (150 à 250ko) s'affichent chez moi en baissé
de rideau.
Post by CrazyCat
Post by SAM
C'est mieux une classe ?
Faut que je pense à me renseigner alors.
Une piste ?
J'avais commencé à en coder une, mais il faudrait que je l'achève enfin :)
Tu peux peut-être regarder du côté de
<http://mambo-developer.org/api/nav.html?mambots/editors/mostlyce/jscripts/tiny_mce/imagemanager/Classes/ImageManager.php.html>
Boudiou!
Tu m'envoies direct sur du super ardu sans aucun ménagement
là dis donc!
Déjà l'autre m'a creuvé avec ses pixels métamorphosés en DPI
alors ici ... yè souis perdousse de perdosso. keskilmveulent?

J'y vois : "thumbnail directory"
qu'est-ce que c'est ça une "vignette" de répertoire ?
Post by CrazyCat
pour t'inspirer.
Heu ...
Une classe c'est une espèce de bibli ?
Je me demande si ça me plait : on a déjà cinquante douze mille fonctions
en php, s'il faut en rajouter issues d'une bibli...

Le serveur te me la met en cache pour, sans nouvel appel, resservir sur
chaque page vue ?
Post by CrazyCat
Post by SAM
C'est bien séparé, presque tt le php d'un bloc.
Oui, c'est effectivement facile à suivre, pour le test de fonctionnement :)
Oui, bon, ben, j'avais demandé des correctifs ;-)
C'est trop bateau pour être remanié ?
Mieux vaut-il tout mettre dans une fonction externe ?
(en attendant que je comprenne ce qu'est une classe)

Rappel : je ne comprends rien au PHP (des fois que ça aurait échappé)
Même que je suis très fier d'avoir amélioré l'affichage des vignettes en
passant par un album automatique et ses grandes vues tout en php (au
lieu du JS vite fait), pourtant ça ne pète vraiment pas haut.

Nota: normalement mon truc pour test n'est plus là.
(le fichier txt est resté)
Encore merci à ceux qui sont passés.
--
sm
Christophe Bachmann
2009-10-09 13:32:03 UTC
Permalink
Post by SAM
Tiens, au fait, puisque tu as l'air de t'y connaitre, comment réalise
t-on un jpeg qui s'affiche dans un brouteur d'abord dégueu puis qui
progressivement s'améliore ? (fabrication en php s'entend)
Là les jpeg uploadés lourds (150 à 250ko) s'affichent chez moi en baissé
de rideau.
Ca n'a rien à voir avec PHP mais avec le .jpg lui même, qui peut être
enregistré en entrelacé ou non.
Post by SAM
J'y vois : "thumbnail directory"
qu'est-ce que c'est ça une "vignette" de répertoire ?
Non, un répertoire de vignettes (l'anglais met les qualificateurs avant
le nom final.
--
Greetings, Salutations,
Guiraud Belissen, Château du Ciel, Drachenwald,
Chris CII, Rennes, France
SAM
2009-10-09 16:24:04 UTC
Permalink
Post by Christophe Bachmann
Post by SAM
Tiens, au fait, puisque tu as l'air de t'y connaitre, comment réalise
t-on un jpeg qui s'affiche dans un brouteur d'abord dégueu puis qui
progressivement s'améliore ? (fabrication en php s'entend)
Là les jpeg uploadés lourds (150 à 250ko) s'affichent chez moi en baissé
de rideau.
Ca n'a rien à voir avec PHP mais avec le .jpg lui même, qui peut être
enregistré en entrelacé ou non.
Donc je répettationne ma question : comment je fais ça en PHP ?
(je vois qu'Olivier y répond à la suite)

Là j'ai utilisé :
$src = imagecreatefromjpeg($img_orig);
puis redimensions :
$tmp = imagecreatetruecolor($tn_width, $tn_height);
et enfin pour enregistrer :
imagejpeg($tmp, $img_dest, 70);
(au passage j'essaie de reduire le jpg)
Post by Christophe Bachmann
Post by SAM
J'y vois : "thumbnail directory"
qu'est-ce que c'est ça une "vignette" de répertoire ?
Non, un répertoire de vignettes (l'anglais met les qualificateurs avant
le nom final.
Ha? le s de thumbnail m'aura échappé ?
--
sm
Olivier Miakinen
2009-10-09 17:12:47 UTC
Permalink
Post by SAM
Donc je répettationne ma question : comment je fais ça en PHP ?
(je vois qu'Olivier y répond à la suite)
$src = imagecreatefromjpeg($img_orig);
$tmp = imagecreatetruecolor($tn_width, $tn_height);
imagejpeg($tmp, $img_dest, 70);
(au passage j'essaie de reduire le jpg)
Je parierais pour :

list($orig_width, $orig_height) = getimagesize($img_orig);
$src = imagecreatefromjpeg($img_orig);
$tmp = imagecreatetruecolor($tn_width, $tn_height);
imagecopyresampled($tmp, $src, 0, 0, 0, 0,
$tn_width, $tn_height, $orig_width, $orig_height);
imageinterlace($tmp, 1);
imagejpeg($tmp, $img_dest, 70);
imagedestroy($src);
imagedestroy($tmp);

(Non testé)


Remarques :
1) si tu connais déjà $orig_width et $orig_height, inutile de les
recalculer ;
2) tu as aussi imagecopyresized() au lieu de imagecopyresampled(), avec
exactement les mêmes paramètres dans le même ordre, mais je pense que
la qualité est moindre (alors que cela va plus vite) ;
3) j'imagine que tu pourrais intervertir les appels à imagecopyresampled
et à imageinterlace sans que cela change quoi que ce soit ;
4) les imagedestroy sont inutiles si ton script s'arrête là, mais ils
libèrent la mémoire au cas où tu aurais plusieurs traitements à
enchaîner de suite.

<HS>
Post by SAM
Post by Christophe Bachmann
Post by SAM
J'y vois : "thumbnail directory"
qu'est-ce que c'est ça une "vignette" de répertoire ?
Non, un répertoire de vignettes (l'anglais met les qualificateurs avant
le nom final.
Ha? le s de thumbnail m'aura échappé ?
Moi aussi cela m'a surpris la première fois que j'ai vu ce genre de
truc. D'après ce que j'ai compris, lorsque un nom est utilisé comme ça
pour qualifier un autre nom il devient un adjectif, et comme tous les
adjectifs en anglais il est alors invariable.

</HS>

Olivier Miakinen
2009-10-09 13:32:03 UTC
Permalink
Post by SAM
Tiens, au fait, puisque tu as l'air de t'y connaitre, comment réalise
t-on un jpeg qui s'affiche dans un brouteur d'abord dégueu puis qui
progressivement s'améliore ? (fabrication en php s'entend)
Excellente question ! Je ne connaissais pas la réponse, mais j'ai trouvé
ceci :

<cit. http://fr.php.net/manual/fr/function.imagejpeg.php>
Note: Si vous voulez générer des images JPEG progressives, vous devez
activer l'entrelacement à l'aide de la fonction imageinterlace().
</cit.>

puis :

<cit. http://fr.php.net/manual/fr/function.imageinterlace.php>
int imageinterlace ( resource $image [, int $interlace= 0 ] )

imageinterlace() active ou désactive le bit d'entrelacement.

Si l'entrelacement est à 1 et l'image est JPEG, l'image créée sera un
JPEG progressif.
</cit.>
Post by SAM
Là les jpeg uploadés lourds (150 à 250ko) s'affichent chez moi en baissé
de rideau.
Je ne sais pas si c'est vrai, mais ceci est alléchant :

<http://www.buvetteetudiants.com/cours/administrator/html-css/jpeg-jpg-jpe-jfif.php#jpeg-progressif>
A l'inverse du GIF et PNG, un JPEG progressif est plus léger qu'un JPEG
standard.
</>

Cordialement,
--
Olivier Miakinen
SAM
2009-10-09 16:26:36 UTC
Permalink
Post by Olivier Miakinen
Post by SAM
Tiens, au fait, puisque tu as l'air de t'y connaitre, comment réalise
t-on un jpeg qui s'affiche dans un brouteur d'abord dégueu puis qui
progressivement s'améliore ? (fabrication en php s'entend)
Excellente question ! Je ne connaissais pas la réponse, mais j'ai trouvé
<cit. http://fr.php.net/manual/fr/function.imagejpeg.php>
Note: Si vous voulez générer des images JPEG progressives, vous devez
activer l'entrelacement à l'aide de la fonction imageinterlace().
</cit.>
<cit. http://fr.php.net/manual/fr/function.imageinterlace.php>
int imageinterlace ( resource $image [, int $interlace= 0 ] )
Rhalala !
Mais je n'étais pas descendu si bas dans cette page :-(

ça me donnera donc :

J'ai d'abord utilisé pour dupliquer l'image originale :
$src = imagecreatefromjpeg($img_orig);

puis redimensions :
$tmp = imagecreatetruecolor($tn_width, $tn_height);

donc, maintenant : modif en entrelacé :
imageinterlace( $tmp, 1);
à moins quil ne fallu le faire avant ? sur l'image d'origine :
imageinterlace( $src, 1);
lequel des 2 ?

et enfin pour enregistrer :
imagejpeg($tmp, $img_dest, 70);
(au passage j'essaie de réduire le jpg, mais pas trop)
--
sm
Continuer la lecture sur narkive:
Loading...