Heim >Backend-Entwicklung >Golang >So drehen Sie Golang-Bilder

So drehen Sie Golang-Bilder

PHPz
PHPzOriginal
2023-04-05 14:37:09928Durchsuche

Golang ist eine Programmiersprache, die viele Operationen und Techniken unterstützt, darunter die Bildrotation. In diesem Artikel erfahren Sie, wie Sie mit Golang die Bilddrehung implementieren.

Zunächst müssen wir einige notwendige Bibliotheken und Tools vorbereiten, die uns eine einfache Bearbeitung von Bildern ermöglichen. Die folgenden Bibliotheken müssen wir verwenden:

  1. image: eine offiziell von Golang bereitgestellte Bibliothek für die Bildverarbeitung;
  2. math: Eine Bibliothek im Zusammenhang mit mathematischen Berechnungen, die zur Berechnung von Drehwinkeln verwendet werden können.
  3. Zusätzlich zu den oben genannten Bibliotheken benötigen wir auch eine Bilddatei als Beispiel. Hier wählen wir ein Nachtszenenbild aus und nennen es „night.jpg“.

Zuerst müssen wir dieses Bild öffnen und die Funktion image.Decode verwenden, um es in einen Bildtyp zu dekodieren:

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

Als nächstes können wir den image.NewRGBAverwenden > Funktion Erstellen Sie ein neues RGBA-Bild und zeichnen Sie dann das Originalbild über image.Draw in das neue Bild. Damit soll sichergestellt werden, dass unsere Änderungen am Originalbild keine Auswirkungen auf das Originalbild selbst haben: 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})
Beim Bilddrehungsprozess müssen wir einen Drehwinkel angeben. Wir können math.Pi verwenden, um Pi zu erhalten, und die Funktionen math.Sin und math.Cos verwenden, um die Summe der Sin-Werte zu berechnen ​in verschiedenen Winkeln Der cos-Wert wird zur Berechnung der Rotationsmatrix verwendet.

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})
}
Wir können dann eine image.Affine-Transformationsmatrix erstellen und diese auf unser Bild anwenden, um die Drehung zu erreichen. Die image.Affine-Matrix kann uns dabei helfen, Transformationen wie Drehung, Verschiebung und Skalierung des Bildes im dreidimensionalen Raum durchzuführen:

rrreee

Schließlich speichern wir das verarbeitete Bild in einer lokalen Datei:

rrreee

Vollständig Der Code lautet wie folgt: 🎜rrreee🎜Bisher haben wir die Bildrotationsfunktion mit Golang erfolgreich implementiert. Mit dem obigen Code können wir nicht nur das Bild drehen, sondern auch andere Bildoperationen ausführen. Golang bietet viele hervorragende Bildverarbeitungsbibliotheken, und wir können sie mit den Programmiersprachenfunktionen von Golang kombinieren, um schönere und praktischere Anwendungen zu erstellen. 🎜

Das obige ist der detaillierte Inhalt vonSo drehen Sie Golang-Bilder. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn