Golang は、多くの操作とテクニックをサポートするプログラミング言語であり、その 1 つが画像の回転です。この記事では、Golang を使用して画像の回転を実装する方法を学びます。
まず、画像を簡単に操作できるようにするために必要なライブラリとツールを準備する必要があります。使用する必要があるライブラリは次のとおりです:
上記のライブラリに加えて、サンプルとして画像ファイルも必要です。ここでは夜景の画像を選択し、「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
を通じて元のイメージをこの新しいイメージに描画します。この目的は、元の画像に対する変更が元の画像自体に影響を及ぼさないようにすることです。
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.Sin
関数と math.Cos
関数を使用してさまざまな角度での sin 値と cos 値を計算できます。角度、これを使用して回転行列を計算します。
angle := 45.0 radians := angle * math.Pi / 180.0 sin := math.Sin(radians) cos := math.Cos(radians)
次に、image.Affine
変換行列を作成し、それを画像に適用して回転を実現します。 image.Affine
行列は、3 次元空間での画像の回転、平行移動、スケーリングなどの変換を実行するのに役立ちます:
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 中国語 Web サイトの他の関連記事を参照してください。