Maison  >  Article  >  développement back-end  >  Comment faire pivoter les images Golang

Comment faire pivoter les images Golang

PHPz
PHPzoriginal
2023-04-05 14:37:09883parcourir

Golang est un langage de programmation qui prend en charge de nombreuses opérations et techniques, dont la rotation d'images. Dans cet article, nous apprendrons comment utiliser Golang pour implémenter la rotation d'image.

Tout d'abord, nous devons préparer quelques bibliothèques et outils nécessaires qui nous permettent d'opérer facilement sur les images. Voici les bibliothèques que nous devons utiliser :

  1. image : une bibliothèque officiellement fournie par Golang pour le traitement d'images ;
  2. image/draw : une bibliothèque de dessins d'images, principalement utilisée pour dessiner et transformer des images ; liés aux calculs mathématiques, qui peuvent être utilisés pour calculer les angles de rotation.
  3. En plus des bibliothèques ci-dessus, nous avons également besoin d'un fichier image comme exemple. Ici, nous choisissons une image de scène de nuit et la nommons "night.jpg".

Tout d'abord, nous devons ouvrir cette image et utiliser la fonction image.Decode pour la décoder en un type d'image :

file, err := os.Open("night.jpg")
if err != nil {
    log.Fatal(err)
}
img, _, err := image.Decode(file)
if err != nil {
    log.Fatal(err)
}

Ensuite, nous pouvons utiliser la fonction image.NewRGBA fonction Créez une nouvelle image RGBA, puis dessinez l'image originale dans la nouvelle image via image.Draw. Le but est de garantir que nos modifications sur l'image originale n'affecteront pas l'image originale elle-même : image.Decode函数将其解码为Image类型:

rotated := image.NewRGBA(image.Rect(0, 0, img.Bounds().Dy(), img.Bounds().Dx()))
draw.Draw(rotated, rotated.Bounds(), img, img.Bounds().Min, draw.Src)

接下来,我们可以通过image.NewRGBA函数创建一个新的RGBA图像,然后通过image.Draw将原图像绘制到这个新的图像中。这样做的目的是为了确保我们对原图像的修改不会影响原图像本身:

angle := 45.0
radians := angle * math.Pi / 180.0
sin := math.Sin(radians)
cos := math.Cos(radians)

在图片旋转的过程中,我们需要指定一个旋转的角度。我们可以使用math.Pi来获取圆周率,并使用math.Sinmath.Cos函数计算出不同角度下的sin值和cos值,以此来计算旋转的矩阵。

matrix := affine.NewMatrix3(
    cos, sin, 0,
    -sin, cos, 0,
    0, 0, 1,
)
transform := affine.NewAffineTransform(matrix, rotated.Bounds())
transform.Invert()
affineRect := transform.Bounds(rotated.Bounds())
result := image.NewRGBA(image.Rect(0, 0, affineRect.Dx(), affineRect.Dy()))
draw.Draw(result, result.Bounds(), rotated, affineRect.Min, draw.Src)
affineRect = transform.Bounds(rotated.Bounds())

然后,我们可以创建一个image.Affine变换矩阵,并将其应用于我们的图像来实现旋转。image.Affine

out, err := os.Create("rotated.jpg")
if err != nil {
    log.Fatal(err)
}
jpeg.Encode(out, result, &jpeg.Options{Quality: 100})
Dans le processus de rotation de l'image, nous devons spécifier un angle de rotation. Nous pouvons utiliser math.Pi pour obtenir pi, et utiliser les fonctions math.Sin et math.Cos pour calculer la somme des valeurs de sin ​​sous différents angles La valeur cos est utilisée pour calculer la matrice de rotation.

package main

import (
    "image"
    "image/draw"
    "image/jpeg"
    "log"
    "math"

    "github.com/disintegration/gift/affine"
    "os"
)

func main() {
    file, err := os.Open("night.jpg")
    if err != nil {
        log.Fatal(err)
    }
    img, _, err := image.Decode(file)
    if err != nil {
        log.Fatal(err)
    }

    rotated := image.NewRGBA(image.Rect(0, 0, img.Bounds().Dy(), img.Bounds().Dx()))
    draw.Draw(rotated, rotated.Bounds(), img, img.Bounds().Min, draw.Src)

    angle := 45.0
    radians := angle * math.Pi / 180.0
    sin := math.Sin(radians)
    cos := math.Cos(radians)

    matrix := affine.NewMatrix3(
        cos, sin, 0,
        -sin, cos, 0,
        0, 0, 1,
    )
    transform := affine.NewAffineTransform(matrix, rotated.Bounds())
    transform.Invert()
    affineRect := transform.Bounds(rotated.Bounds())
    result := image.NewRGBA(image.Rect(0, 0, affineRect.Dx(), affineRect.Dy()))
    draw.Draw(result, result.Bounds(), rotated, affineRect.Min, draw.Src)
    affineRect = transform.Bounds(rotated.Bounds())

    out, err := os.Create("rotated.jpg")
    if err != nil {
        log.Fatal(err)
    }
    jpeg.Encode(out, result, &jpeg.Options{Quality: 100})
}
Nous pouvons ensuite créer une matrice de transformation image.Affine et l'appliquer à notre image pour réaliser la rotation. La matrice image.Affine peut nous aider à effectuer des transformations telles que la rotation, la translation et la mise à l'échelle de l'image dans l'espace tridimensionnel :

rrreee

Enfin, nous enregistrons l'image traitée dans un fichier local :

rrreee

Complete Le code est le suivant : 🎜rrreee🎜Jusqu'à présent, nous avons implémenté avec succès la fonction de rotation d'image à l'aide de Golang. Grâce au code ci-dessus, nous pouvons non seulement faire pivoter l'image, mais également effectuer d'autres opérations sur l'image. Golang fournit de nombreuses excellentes bibliothèques de traitement d'images, et nous pouvons les combiner avec les fonctionnalités du langage de programmation de Golang pour créer des applications plus belles et plus pratiques. 🎜

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:
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