Golang の画像の回転と反転の方法
画像処理では、画像の回転と反転が必要になることがよくあります。この記事では、Golang を使用して画像を回転および反転する方法と、対応するコード例を紹介します。
まず、2 つのパッケージ image
と image/draw
をインポートする必要があります。
import ( "image" "image/draw" )
次に、関数 RotateImage を定義します。
画像回転の実装に使用されます:
func RotateImage(src image.Image, angle float64) *image.RGBA { //计算旋转后的图片尺寸 bounds := src.Bounds() width := bounds.Max.X - bounds.Min.X height := bounds.Max.Y - bounds.Min.Y offsetX := float64(width) / 2 offsetY := float64(height) / 2 //创建旋转后的图片 rotateImg := image.NewRGBA(bounds) rotateImgRect := rotateImg.Bounds() //根据旋转角度计算旋转后每个像素的位置 for x := rotateImgRect.Min.X; x < rotateImgRect.Max.X; x++ { for y := rotateImgRect.Min.Y; y < rotateImgRect.Max.Y; y++ { px := float64(x) - offsetX py := float64(y) - offsetY rotX := float64(px)*math.Cos(angle) - float64(py)*math.Sin(angle) rotY := float64(px)*math.Sin(angle) + float64(py)*math.Cos(angle) rotX += offsetX rotY += offsetY //获取旋转后位置对应的原图像素 if rotX >= 0 && rotX < float64(width) && rotY >= 0 && rotY < float64(height) { rotateImg.Set(x, y, src.At(int(rotX), int(rotY))) } } } return rotateImg }
上記の関数は 2 つのパラメーターを受け取ります。src
はソース画像を表し、angle
は回転角度を表します。この関数はまず、回転された画像のサイズを計算し、回転結果を保存するための新しい RGBA 画像を作成します。
次に、2 つのネストされたループを使用して、回転後の各ピクセル位置をトラバースし、元のイメージ内の対応する位置を計算し、その位置のピクセル値を取得します。最後に、そのピクセル値を回転した画像に設定します。
次に、画像反転を実装する関数 FlipImage
を定義します。
func FlipImage(src image.Image) *image.RGBA { //计算翻转后的图片尺寸 bounds := src.Bounds() width := bounds.Max.X - bounds.Min.X height := bounds.Max.Y - bounds.Min.Y //创建翻转后的图片 flipImg := image.NewRGBA(bounds) flipImgRect := flipImg.Bounds() //翻转画布 draw.Draw(flipImg, flipImgRect, src, bounds.Min, draw.Src) //水平翻转 for x := flipImgRect.Min.X; x < flipImgRect.Max.X; x++ { for y := flipImgRect.Min.Y; y < flipImgRect.Max.Y; y++ { flipX := flipImgRect.Max.X - x - 1 flipImg.Set(flipX, y, flipImg.At(x, y)) } } return flipImg }
上記のコードは、まず反転された画像のサイズを計算し、To を使用して新しい RGBA 画像を作成します。反転後に結果を保存します。次に、draw.Draw()
関数を使用して、ソース イメージを反転したイメージに描画します。
最後に、各ピクセル位置は 2 つのネストされたループを通過し、水平方向に反転され、反転されたイメージに設定されます。
次に、上記のコードをテストする main 関数を作成します。
func main() { //读取原始图片 file, _ := os.Open("source.png") defer file.Close() src, _, _ := image.Decode(file) //旋转图片 rotateImg := RotateImage(src, math.Pi/4) rotateFile, _ := os.Create("rotate.png") defer rotateFile.Close() png.Encode(rotateFile, rotateImg) //翻转图片 flipImg := FlipImage(src) flipFile, _ := os.Create("flip.png") defer flipFile.Close() png.Encode(flipFile, flipImg) }
上記のコードは、まず image.Decode()
関数を通じて元の画像を読み取り、次に## を呼び出します。 #RotateImage() 関数と
FlipImage() 関数は、それぞれ回転操作と反転操作を実行します。最後に、結果は
png.Encode() 関数を通じてファイルに保存されます。
以上がGolang で画像の回転と反転を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。