首頁 >後端開發 >Golang >golang圖片怎麼旋轉

golang圖片怎麼旋轉

PHPz
PHPz原創
2023-04-05 14:37:09928瀏覽

Golang是一種程式語言,它支援許多操作和技術,其中之一就是圖片旋轉。在這篇文章中,我們將學習如何使用Golang來實現圖片旋轉的功能。

首先,我們需要準備一些必要的函式庫和工具,這些函式庫和工具可以讓我們輕鬆地對圖片進行操作。以下是我們需要使用的庫:

  1. image:Golang官方提供的一個用於圖像處理的庫;
  2. image/draw:一個圖像繪製庫,主要用於對影像進行畫圖和變換操作;
  3. math:數學計算相關的函式庫,可以用來計算旋轉角度。

除了以上的庫之外,我們還需要一個圖片檔案作為我們的樣本,這裡我們選用一張夜景圖片,命名為"night.jpg"。

首先,我們需要開啟這張圖片,使用image.Decode函數將其解碼為Image類型:

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

接下來,我們可以透過image .NewRGBA函數建立一個新的RGBA影像,然後透過image.Draw將原始影像繪製到這個新的影像中。這樣做的目的是為了確保我們對原始圖像的修改不會影響原始圖像本身:

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

在圖片旋轉的過程中,我們需要指定一個旋轉的角度。我們可以使用math.Pi來取得圓周率,並使用math.Sinmath.Cos函數計算出不同角度下的sin值和cos值,以此來計算旋轉的矩陣。

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

然後,我們可以建立一個image.Affine變換矩陣,並將其應用於我們的圖像來實現旋轉。 image.Affine矩陣可以幫助我們在三維空間中對圖像進行旋轉、平移和縮放等變換:

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})

完整的程式碼如下:

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})
}

至此,我們已經成功地用Golang實現了圖片旋轉的功能。透過以上的程式碼,我們不僅可以旋轉圖片,還可以進行其它的圖像操作。 Golang提供了許多優秀的影像處理函式庫,我們可以將它們與Golang的程式語言特性結合起來,創造出更為精美、實用的應用程式。

以上是golang圖片怎麼旋轉的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn