Golang の写真を回転する方法

PHPz
リリース: 2023-04-05 14:57:40
オリジナル
901 人が閲覧しました

Golang は、多くの操作とテクニックをサポートするプログラミング言語であり、その 1 つが画像の回転です。この記事では、Golang を使用して画像の回転を実装する方法を学びます。

まず、画像を簡単に操作できるようにするために必要なライブラリとツールを準備する必要があります。使用する必要があるライブラリは次のとおりです:

  1. image: 画像処理用に Golang によって公式に提供されるライブラリ;
  2. image/draw: 主に画像に使用される画像描画ライブラリ描画および変形が可能;
  3. math: 回転角度の計算に使用できる数学的計算に関連するライブラリ。

上記のライブラリに加えて、サンプルとして画像ファイルも必要です。ここでは夜景の画像を選択し、「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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート