Table des matières
2. À propos de la fonction d'aperçu de la sélection
3. Obtenez l'extension du fichier téléchargé
4. Obtenir la direction de prise de photos avec iOS
5.ios direction de la photo Correction
Maison interface Web Tutoriel H5 H5 utilise des composants React pour prendre des photos et sélectionner des images à télécharger

H5 utilise des composants React pour prendre des photos et sélectionner des images à télécharger

Dec 31, 2018 am 09:45 AM
html5 javascript react.js

Le contenu de cet article concerne H5 utilisant des composants React pour prendre des photos et sélectionner des photos à télécharger. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Il y a quelque temps, le projet a été restructuré et transformé en projet SSR, mais le composant de téléchargement de sélection d'images utilisé auparavant ne prenait pas en charge SSR (rendu côté serveur). J’ai donc mené des recherches et trouvé de nombreux outils. Mais certains sont trop gros, certains sont difficiles à utiliser et certains ne répondent pas aux besoins d'utilisation. J'ai décidé d'écrire moi-même un composant de téléchargement d'images mobiles h5. Le téléchargement d’images est une exigence relativement courante. La version PC convient, mais la version mobile n’est pas particulièrement facile à réaliser. Ci-dessous, nous enregistrons brièvement quelques problèmes clés du processus.

Points clés

1. À propos de la saisie

La fonction de sélection est implémentée à l'aide de la balise L'attribut accept='image/*', :capture signifie que le périphérique par défaut du système peut être capturé, tel que : caméra - caméscope --caméra ; microphone - enregistrement. Si capture="camera" est défini, la caméra sera utilisée par défaut. Il y a un problème avec certains modèles qui ne peuvent pas appeler la caméra, nous ne la définirons donc pas ici. Permet plusieurs sélections, plus une fonction de rappel pour l'événement onchange. L'entrée finale ressemblera probablement à ceci :

<input type=&#39;file&#39;
    className={classes.picker}
    accept=&#39;image/*&#39;
    multiple
    capture="camera"
    onChange={this.onfileChange} />

Bien sûr, cette entrée est moche. Nous pouvons l'écraser avec le style de bouton de sélection dont nous avons besoin en définissant `opacity:0` et en le positionnant. Rendez-le un peu plus glamour.

2. À propos de la fonction d'aperçu de la sélection

Pouvoir prévisualiser après avoir sélectionné une image est une fonction courante. Laissons de côté le style ici et ne parlons que de l'implémentation du code. Dans la fonction de rappel d'onchange, nous pouvons obtenir le fichier sélectionné via e.target.files, mais le fichier ne peut pas être affiché sur la page. La méthode habituelle consiste à utiliser reader.readAsDataURL(file) pour le convertir en base64 puis à l'afficher. sur la page supérieure. J'utilise ici une grille de neuf carrés, et chaque image est une toile. Compte tenu du problème des différents formats d'image, j'obtiens d'abord le fichier base64 via reader.readAsDataURL(file). Créez ensuite une image dessinée à travers les proportions du canevas de la grille à neuf carrés, afin que le contenu de l'image puisse couvrir l'intégralité du canevas sans distorsion.

fileToCanvas (file, index) {//文件
        let reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = (event) => {
            let image = new Image();
            image.src = event.target.result;
            image.onload = () => {
                let imageCanvas = this['canvas' + index].getContext('2d');
                let canvas = { width: imageCanvas.canvas.scrollWidth * 2, height: imageCanvas.canvas.scrollHeight * 2 };
                let ratio = image.width / image.height;
                let canvasRatio = canvas.width / canvas.height;
                let xStart = 0; let yStart = 0; let renderableWidth; let renderableHeight;
                if (ratio > canvasRatio) { 
                // 横向过大,以高为准,缩放宽度
                    let hRatio = image.height / canvas.height;
                    renderableHeight = image.height;
                    renderableWidth = canvas.width * hRatio;
                    xStart = (image.width - renderableWidth) / 2;
                }
                if (ratio < canvasRatio) { 
                // 横向过小,以宽为准,缩放高度
                    let wRatio = image.width / canvas.width;
                    renderableWidth = image.width;
                    renderableHeight = canvas.height * wRatio;
                    yStart = (image.height - renderableHeight) / 2;
                }
                imageCanvas.drawImage(image, xStart, yStart, renderableWidth, renderableHeight, 0, 0, canvas.width * 2, canvas.height);
            };
        };
    }

3. Obtenez l'extension du fichier téléchargé

Lors de la prise de photos sur certains modèles, le fichier obtenu via l'événement onchange est blob (Xiaomi 6, etc.) À cette fois, via blob.type Déterminez manuellement l'extension.

4. Obtenir la direction de prise de photos avec iOS

Lorsque l'image iOS est téléchargée, il s'avère que le fichier local a été pivoté. La raison en est en effet normale. le problème ne sera pas expliqué en détail ici. Si vous êtes intéressé, vous pouvez le rechercher. Nous devons donc détecter l'orientation et faire pivoter l'image vers son orientation normale. Il existe de nombreuses bibliothèques prêtes à l'emploi pour s'orienter, comme Exif.js. Mais cette bibliothèque est un peu volumineuse, et cela ne semble pas valoir la peine de l’introduire pour cette petite exigence. Il existe de nombreux codes prêts à l'emploi pour obtenir la direction de l'image sur stackoverflow.
Légèrement modifié :

getOrientation (file) {
        return new Promise((resolve, reject) => {
            let reader = new FileReader();
            reader.onload = function (e) {
            //e.target.result为base64编码的文件
                let view = new DataView(e.target.result);
                if (view.getUint16(0, false) !== 0xffd8) {
                    return resolve(-2);
                }
                let length = view.byteLength;
                let offset = 2;
                while (offset < length) {
                    let marker = view.getUint16(offset, false);
                    offset += 2;
                    if (marker === 0xffe1) {
                        let tmp = view.getUint32(offset += 2, false);
                        if (tmp !== 0x45786966) {
                            return resolve(-1);
                        }
                        let little = view.getUint16(offset += 6, false) === 0x4949;
                        offset += view.getUint32(offset + 4, little);
                        let tags = view.getUint16(offset, little);
                        offset += 2;
                        for (let i = 0; i < tags; i++) {
                            if (view.getUint16(offset + i * 12, little) === 0x0112) {
                                return resolve(view.getUint16(offset + i * 12 + 8, little));
                            }
                        }
                    } else if ((marker & 0xff00) !== 0xff00) {
                        break;
                    } else {
                        offset += view.getUint16(offset, false);
                    }
                }
                return resolve(-1);
            };

            reader.readAsArrayBuffer(file.slice(0, 64 * 1024));
        });
    }

//Valeur de retour : 1--normal, -2--non-jpg, -1--indéfini

5.ios direction de la photo Correction

L'orientation normale de l'image doit être 1, nous convertissons donc le fichier en canevas et utilisons la méthode de transformation de canevas pour transformer le canevas, veuillez vous y référer. Enfin, récupérez l'image base64 avec la direction normale du codage base64 via canvas.toDataURL(''), puis convertissez la base64 en blob pour le téléchargement

    //重置文件orientation
resetOrientationToBlob (file, orientation) {
    return new Promise((resolve, reject) => {
        let reader = new FileReader();
        reader.readAsDataURL(file);
        reader.onload = (event) => {
            let image = new Image();
            image.src = event.target.result;
            image.onload = () => {
                let width = image.width;
                let height = image.height;
                let canvas = document.createElement('canvas');
                let ctx = canvas.getContext('2d');
                if (orientation > 4 && orientation < 9) {
                    canvas.width = height;
                    canvas.height = width;
                } else {
                    canvas.width = width;
                    canvas.height = height;
                }

                switch (orientation) {
                case 2:
                    ctx.transform(-1, 0, 0, 1, width, 0);
                    break;
                case 3:
                    ctx.transform(-1, 0, 0, -1, width, height);
                    break;
                case 4:
                    ctx.transform(1, 0, 0, -1, 0, height);
                    break;
                case 5:
                    ctx.transform(0, 1, 1, 0, 0, 0);
                    break;
                case 6:
                    ctx.transform(0, 1, -1, 0, height, 0);
                    break;
                case 7:
                    ctx.transform(0, -1, -1, 0, height, width);
                    break;
                case 8:
                    ctx.transform(0, -1, 1, 0, 0, width);
                    break;
                default:
                    ctx.transform(1, 0, 0, 1, 0, 0);
                }

                ctx.drawImage(image, 0, 0, width, height);
                let base64 = canvas.toDataURL('image/png');
                let blob = this.dataURLtoBlob(base64);
                resolve(blob);
            };
        };
    });
}

Enfin

Téléchargement d'images, cette partie devrait être relativement simple. Téléchargez simplement le fichier sous la forme de FormData. Le code ci-dessus n'est que le pseudo-code de certaines fonctions et ne constitue pas l'implémentation finale de toutes les fonctions.

Essayez-le si vous le pouvez. Au final, vous constaterez que vous avez beaucoup appris, mais les roues des autres sont encore plus utiles 2333.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1517
276
Définition des vocabulaires personnalisés en utilisant le balisage HTML5 Schema.org. Définition des vocabulaires personnalisés en utilisant le balisage HTML5 Schema.org. Jul 31, 2025 am 10:50 AM

La balise Schema.org aide les moteurs de recherche à comprendre le format de données structuré du contenu de la page Web via des balises sémantiques (telles que la portée de l'élément, le type d'élément, ItemProp); Il peut être utilisé pour définir le vocabulaire personnalisé, les méthodes incluent l'extension des types existants ou l'utilisation de Type supplémentaire pour introduire de nouveaux types; Dans les applications réelles, en gardant la structure claire, en utilisant d'abord les attributs officiels, tester la validité du code et garantir que les types personnalisés sont accessibles; Les précautions comprennent l'acceptation de soutien partiel, d'éviter les erreurs d'orthographe et de choisir un format approprié tel que JSON-LD.

Que sont les attributs de données HTML5? Que sont les attributs de données HTML5? Aug 06, 2025 pm 05:39 PM

Html5dataattributesarecustom, validhtmlattributesUSEdTostoreExtrainWeoleLelementsforjavaScriptorcss.1.TheyaredEfinedAdata- *

Comment les erreurs de gestion de l'analyseur HTML5? Comment les erreurs de gestion de l'analyseur HTML5? Aug 02, 2025 am 07:51 AM

Html5parsershandlemalformedhtmlbyfollowingAdEtterministicalgorithmtoSuSureConsistentAndrobustrendering.1.formismatchathedoruncosedtags, theParserautomAticalCloseStagsAndadjustSnestingBasedonContex

Comment utiliser l'API Canvas pour le dessin de base dans HTML5? Comment utiliser l'API Canvas pour le dessin de base dans HTML5? Aug 07, 2025 am 07:15 AM

Pour utiliser l'API HTML5Canvas pour le dessin de base, créez d'abord l'élément Canvas dans HTML et définissez l'attribut largeur et hauteur, puis obtenez son contexte de rendu 2D via JavaScript; 1. Utilisez FillRect, Strokect et ClearRect pour dessiner et ClearRect; 2. Créez des chemins et dessinez des lignes ou des formes personnalisées via Beginpath, MoveTo, Lineto et ClosePath; 3. Utilisez l'arc pour dessiner des cercles ou des arcs; 4. Utilisez FillText et Stroketext pour ajouter du texte de remplissage ou de trait; 5. Set Fillstyle, StrokeSet, Lin

Quelle est la différence entre  et  dans html5? Quelle est la différence entre et dans html5? Aug 04, 2025 am 11:02 AM

Veuillez clarifier les deux éléments ou attributs HTML5 que vous souhaitez comparer, tels que Versus, contre, ou ID avec classe, afin que je puisse fournir une explication claire et pratique de la différence.

Comment créer une liste commandée dans HTML5? Comment créer une liste commandée dans HTML5? Jul 30, 2025 am 05:23 AM

La création d'une liste commandée dans HTML5 nécessite une utilisation et des balises. 1. Utilisez la liste commandée pour définir la liste commandée et utilisez-la pour représenter chaque élément en interne. 2. Vous pouvez spécifier le numéro de départ via l'attribut de démarrage, 3. Définissez le type de numéro tel que les chiffres, les lettres ou les chiffres romains via l'attribut type. 4. Il est recommandé d'utiliser un compteur de type list de la liste CSS pour obtenir un contrôle de style plus flexible pour séparer les structures et les styles.

Comment fonctionne l'attribut orthographique dans HTML5? Comment fonctionne l'attribut orthographique dans HTML5? Aug 03, 2025 pm 02:46 PM

THESPELLCHECKATTRIBUTInHTML5ControlswetHetHebrowserChecksSpellingandgrammarinedableElements.2.itWorksonInputFields, TextAreas et ContetableElementsByunderLiningerRorSinredorGreen.3.Setto "True" Toenableor "FAUX, FAUSE, TODISSABLE,

Quels sont les formats audio pris en charge dans HTML5? Quels sont les formats audio pris en charge dans HTML5? Aug 05, 2025 pm 08:29 PM

La prise en charge du format audio HTML5 varie d'un navigateur à l'autre. Les formats les plus couramment utilisés comprennent: 1.mp3 (.mp3, audio / mpeg, pris en charge par tous les navigateurs grand public, avec la meilleure compatibilité); 2.Wav (.wav, audio / wav, prends en charge les fichiers meilleurs mais volumineux, adaptés à l'audio court); 3.OGG (.ogg / .oga, audio / ogg, chrome, firefox, support d'opéra, safari et ie ne sont pas pris en charge, sans source gratuite); 4.AAC (.AAC / .M4A, Audio / AAC, Safari, Chrome, support Edge, le support Firefox est limité, souvent utilisé dans les appareils Apple). Pour assurer la compatibilité, le

See all articles