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:
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.NewRGBA
verwenden > 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.Sin
和math.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})
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}) }
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!