はじめに
こんにちは、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
のピクセル情報を参照しています。
おわりに
簡単な内容とはなりますが、画像の反転処理を紹介させて頂きました。
最後まで読んで頂き、ありがとうございました。