Voici un grattoir à nouilles.
Gardant à l'esprit que nous avons le stockage local HTML5 et xhr v2 et autres. Je me demandais si quelqu'un pouvait trouver un exemple de travail ou même simplement me donner un oui ou un non à cette question:
Est-il possible de pré-dimensionner une image en utilisant le nouveau stockage local (ou autre), de sorte qu'un utilisateur qui n'a pas la moindre idée du redimensionnement d'une image puisse faire glisser son image 10 Mo dans mon site Web, il la redimensionner en utilisant le nouveau stockage local et ALORS téléchargez-le à la plus petite taille.
Je sais très bien que vous pouvez le faire avec Flash, applets Java, X actif ... La question est de savoir si vous pouvez le faire avec Javascript + Html5.
Dans l'attente de la réponse sur celui-ci.
Ta pour l'instant.
la source
onload
sur l'image (attacher le gestionnaire avant de définirsrc
), car le navigateur est autorisé à effectuer le décodage de manière asynchrone et les pixels peuvent ne pas être disponibles avantdrawImage
.ctx.drawImage()
la fin.J'ai abordé ce problème il y a quelques années et téléchargé ma solution sur github sous le nom https://github.com/rossturner/HTML5-ImageUploader
La réponse de robertc utilise la solution proposée dans le billet de blog Mozilla Hacks , mais j'ai trouvé que cela donnait une très mauvaise qualité d'image lors du redimensionnement à une échelle qui n'était pas 2: 1 (ou un multiple de celle-ci). J'ai commencé à expérimenter avec différents algorithmes de redimensionnement d'image, bien que la plupart aient fini par être assez lents ou bien de mauvaise qualité non plus.
Enfin, j'ai trouvé une solution qui, je pense, s'exécute rapidement et offre également de très bonnes performances - car la solution Mozilla de copie d'une toile à une autre fonctionne rapidement et sans perte de qualité d'image à un rapport 2: 1, étant donné un objectif de x pixels de large et y pixels de haut, j'utilise cette méthode de redimensionnement de la toile jusqu'à ce que l'image soit comprise entre x et 2 x , et y et 2 y . À ce stade, je passe ensuite au redimensionnement algorithmique de l'image pour la dernière "étape" de redimensionnement jusqu'à la taille cible. Après avoir essayé plusieurs algorithmes différents je me suis installé sur une interpolation bilinéaire tirée d'un blog qui n'est plus en ligne mais accessible via Internet Archive , ce qui donne de bons résultats, voici le code applicable:
Cela réduit une image à une largeur de
config.maxWidth
, en conservant le rapport hauteur / largeur d' origine. Au moment du développement, cela fonctionnait sur iPad / iPhone Safari en plus des principaux navigateurs de bureau (IE9 +, Firefox, Chrome), donc je pense qu'il sera toujours compatible compte tenu de l'adoption plus large de HTML5 aujourd'hui. Notez que l'appel canvas.toDataURL () prend un type mime et une qualité d'image qui vous permettront de contrôler la qualité et le format du fichier de sortie (potentiellement différent de l'entrée si vous le souhaitez).Le seul point que cela ne couvre pas est de conserver les informations d'orientation, sans connaissance de ces métadonnées, l'image est redimensionnée et enregistrée telle quelle, perdant toutes les métadonnées de l'image pour l'orientation, ce qui signifie que les images prises sur une tablette "à l'envers" étaient rendus comme tels, bien qu'ils auraient été retournés dans le viseur de l'appareil photo. Si cela est un problème, cet article de blog contient un bon guide et des exemples de code sur la façon d'accomplir cela, qui, j'en suis sûr, pourraient être intégrés au code ci-dessus.
la source
Correction ci-dessus:
la source
dataurl
pas là.img.width
et auimg.height
départ, ils le sont0
. Vous devriez mettre le reste de la fonction à l'intérieurimg.addEventListener('load', function () { // now the image has loaded, continue... });
Modification de la réponse de Justin qui fonctionne pour moi:
la source
Si vous ne voulez pas réinventer la roue, vous pouvez essayer plupload.com
la source
Manuscrit
la source
Cela ne fonctionnera pas. Du côté PHP, vous ne pouvez pas enregistrer de fichier avec cela.
Utilisez plutôt ce code:
la source
Le redimensionnement des images dans un élément de canevas est généralement une mauvaise idée car il utilise l'interpolation de boîte la moins chère. L'image résultante se dégrade en qualité. Je recommanderais d'utiliser http://nodeca.github.io/pica/demo/ qui peut effectuer la transformation Lanczos à la place. La page de démonstration ci-dessus montre la différence entre les approches canvas et Lanczos.
Il utilise également des web workers pour redimensionner les images en parallèle. Il existe également une implémentation WEBGL.
Il existe des redimensionneurs d'images en ligne qui utilisent pica pour faire le travail, comme https://myimageresizer.com
la source
La réponse acceptée fonctionne très bien, mais la logique de redimensionnement ignore le cas où l'image est plus grande que le maximum dans un seul des axes (par exemple, height> maxHeight mais width <= maxWidth).
Je pense que le code suivant prend en charge tous les cas de manière plus simple et fonctionnelle (ignorez les annotations de type dactylographié si vous utilisez du javascript brut):
la source
Vous pouvez utiliser dropzone.js si vous souhaitez utiliser un gestionnaire de téléchargement simple et facile avec des fonctions de redimensionnement avant téléchargement.
Il a des fonctions de redimensionnement intégrées, mais vous pouvez fournir les vôtres si vous le souhaitez.
la source