ホームページ  >  記事  >  バックエンド開発  >  Golang で画像の回転と反転を実装する方法

Golang で画像の回転と反転を実装する方法

WBOY
WBOYオリジナル
2023-08-27 13:03:301382ブラウズ

Golang で画像の回転と反転を実装する方法

Golang の画像の回転と反転の方法

画像処理では、画像の回転と反転が必要になることがよくあります。この記事では、Golang を使用して画像を回転および反転する方法と、対応するコード例を紹介します。

まず、2 つのパッケージ 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
}

上記の関数は 2 つのパラメーターを受け取ります。src はソース画像を表し、angle は回転角度を表します。この関数はまず、回転された画像のサイズを計算し、回転結果を保存するための新しい RGBA 画像を作成します。

次に、2 つのネストされたループを使用して、回転後の各ピクセル位置をトラバースし、元のイメージ内の対応する位置を計算し、その位置のピクセル値を取得します。最後に、そのピクセル値を回転した画像に設定します。

次に、画像反転を実装する関数 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
}

上記のコードは、まず反転された画像のサイズを計算し、To を使用して新しい RGBA 画像を作成します。反転後に結果を保存します。次に、draw.Draw() 関数を使用して、ソース イメージを反転したイメージに描画します。

最後に、各ピクセル位置は 2 つのネストされたループを通過し、水平方向に反転され、反転されたイメージに設定されます。

次に、上記のコードをテストする main 関数を作成します。

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() 関数を通じてファイルに保存されます。

上記のコード例を通じて、Golang を使用して画像の回転と反転の操作を実装できます。これらの操作は画像処理でよく使用され、いくつかの特殊効果を実現するのにも非常に役立ちます。この記事が、Golang を理解して画像処理に使用するのに役立つことを願っています。

以上がGolang で画像の回転と反転を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。