Golang은 다양한 작업과 기술을 지원하는 프로그래밍 언어이며 그 중 하나는 이미지 회전입니다. 이번 글에서는 Golang을 사용하여 이미지 회전을 구현하는 방법을 알아 보겠습니다.
우선, 이미지 작업을 쉽게 수행하는 데 필요한 몇 가지 라이브러리와 도구를 준비해야 합니다. 다음은 우리가 사용해야 하는 라이브러리입니다:
먼저 이 이미지를 열고 image.Decode
함수를 사용하여 이미지 유형으로 디코딩해야 합니다.
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
를 통해 원본 이미지를 새 이미지에 그립니다. 이것의 목적은 원본 이미지에 대한 수정 사항이 원본 이미지 자체에 영향을 미치지 않도록 하는 것입니다. 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
를 사용하여 pi를 얻을 수 있고, math.Sin
및 math.Cos
함수를 사용하여 sin 값의 합을 계산할 수 있습니다. 다른 각도에서 cos 값은 회전 행렬을 계산하는 데 사용됩니다.
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
변환 행렬을 생성하고 이를 이미지에 적용하여 회전을 달성할 수 있습니다. image.Affine
행렬은 3차원 공간에서 이미지의 회전, 평행 이동 및 크기 조정과 같은 변환을 수행하는 데 도움이 될 수 있습니다. rrreee
마지막으로 처리된 이미지를 로컬 파일에 저장합니다.rrreee
Complete 코드는 다음과 같습니다. 🎜rrreee🎜지금까지 Golang을 사용하여 이미지 회전 기능을 성공적으로 구현했습니다. 위의 코드를 통해 이미지를 회전할 수 있을 뿐만 아니라 다른 이미지 작업도 수행할 수 있습니다. Golang은 뛰어난 이미지 처리 라이브러리를 많이 제공하며 이를 Golang의 프로그래밍 언어 기능과 결합하여 더욱 아름답고 실용적인 애플리케이션을 만들 수 있습니다. 🎜위 내용은 골랑 사진을 회전하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!