0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

goで画像の反転処理を行う

Last updated at Posted at 2022-07-01

はじめに

こんにちは、icemint0828です。
今回は自作パッケージの紹介も兼ねて、goでの画像の反転処理の方法を紹介します。

動作環境

go 1.18.3

使用パッケージ

  • icemint0828/imgedit
    画像の反転処理に使用しています。
    画像ファイルの拡張子の変換にも使用しています。

インストール

$  go get github.com/icemint0828/imgedit@v1.5.0

画像の反転処理

main.go
package main

import (
	"github.com/icemint0828/imgedit"
)

func main() {
	// 反転方向の指定
	isHorizon := true

	// FileConverter
	fc, _, err := imgedit.NewFileConverter("srcImage.png")
	if err != nil {
		panic(err)
	}
	// 反転
	fc.Reverse(isHorizon)
	
	// 保存(jpeg, gif形式での保存も可能)
	err = fc.SaveAs("dstImage.png", imgedit.Png)
	if err != nil {
		panic(err)
	}
}

水平方向の反転をしたい場合は、isHorizon = trueを指定し、垂直方向の反転をしたい場合は、isHorizon = falseを指定します。

fc.SaveAsの第二引数では以下の形式で保存するファイルの形式を選択出来ます。

  • imgedit.Png
  • imgedit.Jpeg
  • imgedit.Gif

画像の反転処理(image取得)

main.go
package main

import (
	"image"

	"github.com/icemint0828/imgedit"
)

func main() {
	// 反転方向の指定
	isHorizon := true

	// srcImgを何らかの方法で取得
	var srcImg image.Image

	// FileConverter
	c := imgedit.NewConverter(srcImg)

	// 反転
	c.Reverse(isHorizon)
	dstImg := c.Convert()

	// dstImgを使用
}

ファイルを介さずにimageを処理したい場合は、上記のようにimgedit.NewConverterで直接画像の加工が出来ます。

パッケージ内の処理の説明

imgeditパッケージ内のconverter.goで反転の処理を実施しています。

converter.go
// Reverse flips the image
func (c *converter) Reverse(isHorizon bool) {
	dst := image.NewRGBA(image.Rect(0, 0, c.Bounds().Dx(), c.Bounds().Dy()))
	srcSize := c.Bounds().Size()
	dstSize := dst.Bounds().Size()
	var f func(int, int) (int, int)
	if isHorizon {
		f = func(x int, y int) (int, int) {
			return srcSize.X - x, y
		}
	} else {
		f = func(x int, y int) (int, int) {
			return x, srcSize.Y - y
		}
	}
	for x := 0; x < dstSize.X; x++ {
		for y := 0; y < dstSize.Y; y++ {
			srcX, srcY := f(x, y)
			dst.Set(x, y, c.Image.At(srcX, srcY))
		}
	}
	c.Image = dst
}

元の画像からサイズを取得し、*image.RGBAに対して、各ピクセルの色情報の書き込みしています。
書き込みをする際に水平方向に反転する場合は、元画像のsrcSize.X - x, yのピクセル情報を参照し、垂直方向に反転する場合は、元画像のx, srcSize.Y - yのピクセル情報を参照しています。

おわりに

簡単な内容とはなりますが、画像の反転処理を紹介させて頂きました。
最後まで読んで頂き、ありがとうございました。

前の記事

goで画像のトリム処理を行う

次の記事

goで画像の色調変換の処理を行う

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?