


Manipulation d'images Golang : comment refléter, faire pivoter et retourner des images
Manipulation d'images Golang : Comment refléter, faire pivoter et retourner des images
1 Introduction
Le traitement d'image est l'un des besoins que nous rencontrons souvent dans de nombreux scénarios de développement. Dans Golang, nous pouvons utiliser le package image pour exploiter et traiter des images. Cet article se concentrera sur la façon d'utiliser Golang pour refléter, faire pivoter et retourner des images, et fournira des exemples de code correspondants.
2. Opération de mise en miroir
La mise en miroir d'une image consiste à modifier la disposition gauche et droite de l'image. Dans Golang, vous pouvez utiliser la fonction Flip du package draw pour implémenter des opérations de mise en miroir.
Ce qui suit est un exemple de code pour refléter et enregistrer des images.
package main import ( "image" "image/draw" "image/jpeg" "os" ) func main() { // 打开图片文件 file, err := os.Open("input.jpg") if err != nil { panic(err) } defer file.Close() // 解码图片 img, _, err := image.Decode(file) if err != nil { panic(err) } // 创建一个新的画布 flipImg := image.NewRGBA(img.Bounds()) // 镜像操作 draw.Draw(flipImg, flipImg.Bounds(), img, img.Bounds().Min, draw.FlipHorizontal) // 创建输出文件 output, err := os.Create("output_flip.jpg") if err != nil { panic(err) } defer output.Close() // 保存为JPEG格式图片 jpeg.Encode(output, flipImg, nil) }
3. Opération de rotation
Faire pivoter l'image consiste à changer la direction et l'angle de l'image. Dans Golang, vous pouvez utiliser la fonction Rotate du package draw pour implémenter des opérations de rotation.
Ce qui suit est un exemple de code pour faire pivoter l'image de 90 degrés dans le sens des aiguilles d'une montre et l'enregistrer.
package main import ( "image" "image/draw" "image/jpeg" "os" ) func main() { // 打开图片文件 file, err := os.Open("input.jpg") if err != nil { panic(err) } defer file.Close() // 解码图片 img, _, err := image.Decode(file) if err != nil { panic(err) } // 创建一个新的画布,大小为旋转后的尺寸 rotateImg := image.NewRGBA(image.Rect(0, 0, img.Bounds().Dy(), img.Bounds().Dx())) // 旋转操作 draw.Draw(rotateImg, rotateImg.Bounds(), img, img.Bounds().Min, draw.Rotate90) // 创建输出文件 output, err := os.Create("output_rotate.jpg") if err != nil { panic(err) } defer output.Close() // 保存为JPEG格式图片 jpeg.Encode(output, rotateImg, nil) }
4. Opération Flip
Retournez l'image pour modifier la disposition supérieure et inférieure de l'image. Dans Golang, vous pouvez utiliser la fonction Flip du package draw pour implémenter l'opération flip.
Ce qui suit est un exemple de code pour retourner l'image et l'enregistrer.
package main import ( "image" "image/draw" "image/jpeg" "os" ) func main() { // 打开图片文件 file, err := os.Open("input.jpg") if err != nil { panic(err) } defer file.Close() // 解码图片 img, _, err := image.Decode(file) if err != nil { panic(err) } // 创建一个新的画布 flipImg := image.NewRGBA(img.Bounds()) // 翻转操作 draw.Draw(flipImg, flipImg.Bounds(), img, img.Bounds().Min, draw.FlipVertical) // 创建输出文件 output, err := os.Create("output_flip.jpg") if err != nil { panic(err) } defer output.Close() // 保存为JPEG格式图片 jpeg.Encode(output, flipImg, nil) }
Dans l'exemple de code ci-dessus, nous utilisons les fonctions associées du package image pour faire fonctionner les images. Parmi eux, la fonction image.Decode est utilisée pour décoder le fichier image et créer un objet image. Avant d'opérer, nous créons d'abord un nouvel objet canevas (c'est-à-dire créons un nouvel objet image), puis utilisons les fonctions du package draw pour effectuer des opérations telles que la mise en miroir, la rotation et le retournement. Enfin, utilisez la fonction Encode du package jpeg pour enregistrer l'image traitée au format JPEG.
5. Résumé
Grâce à l'introduction et aux exemples de code de cet article, nous avons appris à utiliser Golang pour refléter, faire pivoter et retourner des images. En développement réel, nous pouvons effectuer les opérations de traitement d'image correspondantes en fonction de besoins spécifiques pour répondre aux besoins du projet. Dans le même temps, nous pouvons également combiner avec d'autres bibliothèques de traitement d'image, telles que le redimensionnement, le recadrage, etc., pour effectuer des opérations d'image plus complexes.
J'espère que cet article pourra être utile à tout le monde dans le traitement d'images Golang !
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

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

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

Clothoff.io
Dissolvant de vêtements AI

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 !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

TointegrategolangServices withexistingpythoninfrastructure, userestapisorgrpcForInter-Servicecommunication, permettant à la perfection

GolangoffersSuperiorPerformance, nativeConcaunternandViagoroutines, and efficaceResourceUsage, faisant la provision de la trafic, low-lantentencyapis; 2.python, tandis que la locosystème de lavel

GoussessIgnifancelylessmemorythanpythonwhenrunningwebservicesduetolanguagedesignandconcurrencyModeldiFferences.1.go'sgoroutinesaarelightweight withminimalstackoverhead, permest efficace

PythonisthedominantLanguageFormAphineLearningDuetOtsmatureCosystem, tandis que les gorgés de poids limité

La différence de base entre Go et Python dans la gestion de la mémoire est les différents mécanismes de collecte des ordures. GO utilise la dédouanement concurrent (MarkandSweep) GC, qui s'exécute automatiquement et exécute simultanément avec la logique du programme, traite effectivement des références circulaires. Il convient aux scénarios de concurrence élevés, mais ne peut pas contrôler avec précision le temps de recyclage; tandis que Python repose principalement sur le comptage de référence et les références d'objets sont immédiatement publiées lorsqu'elles sont à zéro. L'avantage est qu'il s'agit d'un recyclage instantané et d'une implémentation simple, mais il y a un problème de référence circulaire, ils doivent donc utiliser le module GC pour aider au nettoyage. Dans le développement réel, GO est plus adapté aux programmes de serveurs haute performance, tandis que Python convient aux classes de script ou aux applications avec des exigences de performance faibles.

Lors de la création d'outils de ligne de commande pour la distribution, Golang est plus approprié que Python. Les raisons comprennent: 1. Distribution simple et un seul fichier binaire statique est généré après les compléments GO, sans dépendances supplémentaires; 2. 3. Prend en charge la compilation multiplateforme, aucun outil d'emballage supplémentaire n'est requis et des fichiers exécutables de différentes plates-formes peuvent être générés avec des commandes simples. En revanche, Python nécessite l'installation de bibliothèques d'exécution et de dépendance, qui sont lentes à démarrer, des processus d'emballage complexes, et sujets à la compatibilité et aux faux positifs, il n'est donc pas aussi bon qu'en termes d'expérience de déploiement et de coûts de maintenance.

Le cœur de la migration vers l'architecture des microservices de Golang est de clarifier les limites du service, de sélectionner les modes de communication, de gérer les flux de données et d'optimiser la surveillance du déploiement. Premièrement, les services indépendants sont définis en identifiant les limites de la logique métier telles que la gestion des utilisateurs, le paiement et d'autres modules, et les principes de cohésion élevée et de couplage faible et de conception axés sur le domaine sont suivis; Deuxièmement, les files d'attente REST, GRPC ou de messages sont sélectionnées comme méthodes de communication selon les besoins, tels que l'utilisation de notifications asynchrones de l'événement au lieu d'appels directs; Ensuite, chaque service gère indépendamment la base de données et échange des données via l'API ou l'événement, et utilise CQRS ou SAGA pour traiter les transactions distribuées; Enfin, les services de contenerisation Docker et d'orchestration et de déploiement de Kubernetes sont utilisés pour combiner les journaux, les métriques et les outils de suivi pour obtenir une observabilité complète.

Une interface n'est pas un type de pointeur, il contient deux pointeurs: type dynamique et valeur. 1. La variable d'interface stocke le descripteur de type et le pointeur de données du type spécifique; 2. Lors de l'attribution du pointeur à l'interface, il stocke une copie du pointeur et l'interface elle-même n'est pas un type de pointeur; 3. Si l'interface est nulle, le type et la valeur sont jugés en même temps; 4. Lorsque le récepteur de méthode est un pointeur, seul le type de pointeur peut réaliser l'interface; 5. Dans le développement réel, faites attention à la différence entre la copie de valeur et le transfert de pointeur de l'interface. La compréhension peut éviter les erreurs d'exécution et améliorer la sécurité du code.
