>  기사  >  백엔드 개발  >  골랑 사진을 회전하는 방법

골랑 사진을 회전하는 방법

PHPz
PHPz원래의
2023-04-05 14:37:09882검색

Golang은 다양한 작업과 기술을 지원하는 프로그래밍 언어이며 그 중 하나는 이미지 회전입니다. 이번 글에서는 Golang을 사용하여 이미지 회전을 구현하는 방법을 알아 보겠습니다.

우선, 이미지 작업을 쉽게 수행하는 데 필요한 몇 가지 라이브러리와 도구를 준비해야 합니다. 다음은 우리가 사용해야 하는 라이브러리입니다:

  1. image: 이미지 처리를 위해 Golang에서 공식적으로 제공하는 라이브러리
  2. image/draw: 이미지 그리기 및 변환에 주로 사용되는 라이브러리 회전 각도를 계산하는 데 사용할 수 있는 수학적 계산과 관련됩니다.
  3. 위 라이브러리 외에도 샘플로 사진 파일도 필요합니다. 여기서는 야경 사진을 선택하고 이름을 "night.jpg"로 지정합니다.

먼저 이 이미지를 열고 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.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})
이미지 회전 과정에서 회전 각도를 지정해야 합니다. math.Pi를 사용하여 pi를 얻을 수 있고, math.Sinmath.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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.