Maison  >  Article  >  développement back-end  >  Comment implémenter la rotation et le retournement d'image dans Golang

Comment implémenter la rotation et le retournement d'image dans Golang

WBOY
WBOYoriginal
2023-08-27 13:03:301433parcourir

Comment implémenter la rotation et le retournement dimage dans Golang

Méthode Golang pour faire pivoter et retourner les images

Dans le traitement d'images, il est souvent nécessaire de faire pivoter et retourner les images. Cet article expliquera comment utiliser Golang pour faire pivoter et retourner des images, et fournira des exemples de code correspondants.

Tout d'abord, nous devons importer les packages image et image/draw : imageimage/draw两个包:

import (
    "image"
    "image/draw"
)

接下来,我们定义一个函数RotateImage用于实现图片旋转:

func RotateImage(src image.Image, angle float64) *image.RGBA {
    //计算旋转后的图片尺寸
    bounds := src.Bounds()
    width := bounds.Max.X - bounds.Min.X
    height := bounds.Max.Y - bounds.Min.Y
    offsetX := float64(width) / 2
    offsetY := float64(height) / 2

    //创建旋转后的图片
    rotateImg := image.NewRGBA(bounds)
    rotateImgRect := rotateImg.Bounds()

    //根据旋转角度计算旋转后每个像素的位置
    for x := rotateImgRect.Min.X; x < rotateImgRect.Max.X; x++ {
        for y := rotateImgRect.Min.Y; y < rotateImgRect.Max.Y; y++ {
            px := float64(x) - offsetX
            py := float64(y) - offsetY
            rotX := float64(px)*math.Cos(angle) - float64(py)*math.Sin(angle)
            rotY := float64(px)*math.Sin(angle) + float64(py)*math.Cos(angle)
            rotX += offsetX
            rotY += offsetY

            //获取旋转后位置对应的原图像素
            if rotX >= 0 && rotX < float64(width) && rotY >= 0 && rotY < float64(height) {
                rotateImg.Set(x, y, src.At(int(rotX), int(rotY)))
            }
        }
    }
    return rotateImg
}

上述函数接受两个参数,src表示源图片,angle表示旋转的角度。函数首先计算旋转后的图片尺寸,创建一个新的RGBA图像用于存储旋转后的结果。

然后,通过两个嵌套的循环遍历旋转后的每个像素位置,计算其在原图中对应的位置,并获取该位置的像素值。最后将该像素值设置到旋转后的图像中。

接下来,我们定义一个函数FlipImage用于实现图片翻转:

func FlipImage(src image.Image) *image.RGBA {
    //计算翻转后的图片尺寸
    bounds := src.Bounds()
    width := bounds.Max.X - bounds.Min.X
    height := bounds.Max.Y - bounds.Min.Y

    //创建翻转后的图片
    flipImg := image.NewRGBA(bounds)
    flipImgRect := flipImg.Bounds()

    //翻转画布
    draw.Draw(flipImg, flipImgRect, src, bounds.Min, draw.Src)

    //水平翻转
    for x := flipImgRect.Min.X; x < flipImgRect.Max.X; x++ {
        for y := flipImgRect.Min.Y; y < flipImgRect.Max.Y; y++ {
            flipX := flipImgRect.Max.X - x - 1
            flipImg.Set(flipX, y, flipImg.At(x, y))
        }
    }
    return flipImg
}

以上代码首先计算翻转后的图片尺寸,创建一个新的RGBA图像用于存储翻转后的结果。然后通过draw.Draw()函数将源图片绘制到翻转后的图像中。

最后,通过两个嵌套的循环遍历每个像素位置,将其在水平方向上进行翻转,并设置到翻转后的图像中。

接下来我们编写主函数来测试以上的代码:

func main() {
    //读取原始图片
    file, _ := os.Open("source.png")
    defer file.Close()
    src, _, _ := image.Decode(file)

    //旋转图片
    rotateImg := RotateImage(src, math.Pi/4)
    rotateFile, _ := os.Create("rotate.png")
    defer rotateFile.Close()
    png.Encode(rotateFile, rotateImg)

    //翻转图片
    flipImg := FlipImage(src)
    flipFile, _ := os.Create("flip.png")
    defer flipFile.Close()
    png.Encode(flipFile, flipImg)
}

以上代码首先通过image.Decode()函数读取原始图片,然后调用RotateImage()函数和FlipImage()函数分别进行旋转和翻转操作。最后通过png.Encode()rrreee

Ensuite, nous définissons une fonction RotateImage pour implémenter l'image rotation :

rrreee

La fonction ci-dessus accepte deux paramètres, src représente l'image source et angle représente l'angle de rotation. La fonction calcule d'abord la taille de l'image pivotée et crée une nouvelle image RGBA pour stocker le résultat de la rotation. 🎜🎜Ensuite, à travers deux boucles imbriquées, il parcourt chaque position de pixel après rotation, calcule sa position correspondante dans l'image d'origine et obtient la valeur de pixel à cette position. Enfin, définissez cette valeur de pixel dans l'image pivotée. 🎜🎜Ensuite, nous définissons une fonction FlipImage pour implémenter le retournement d'image : 🎜rrreee🎜Le code ci-dessus calcule d'abord la taille de l'image retournée et crée une nouvelle image RGBA pour stocker le résultat retourné. Dessinez ensuite l'image source dans l'image retournée via la fonction draw.Draw(). 🎜🎜Enfin, parcourez chaque position de pixel à travers deux boucles imbriquées, retournez-la horizontalement et placez-la dans l'image inversée. 🎜🎜Ensuite, nous écrivons la fonction principale pour tester le code ci-dessus : 🎜rrreee🎜Le code ci-dessus lit d'abord l'image originale via la fonction image.Decode(), puis appelle RotateImage() Les fonctions et FlipImage() effectuent respectivement des opérations de rotation et de retournement. Enfin, le résultat est enregistré dans le fichier via la fonction png.Encode(). 🎜🎜Grâce aux exemples de code ci-dessus, nous pouvons utiliser Golang pour implémenter des opérations de rotation et de retournement d'images. Ces opérations sont souvent utilisées en traitement d’images et sont également très utiles pour la réalisation de certains effets spéciaux. J'espère que cet article pourra vous aider à comprendre et à utiliser Golang pour le traitement d'images. 🎜

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