はじめに
こんにちは、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() {
// 切り取り開始位置の指定(px)
left, top := 100, 100
// サイズの指定(px)
width, height := 400, 400
// FileConverter
fc, _, err := imgedit.NewFileConverter("srcImage.png")
if err != nil {
panic(err)
}
// トリム
fc.Trim(left, top, width, height)
// 保存(jpeg, gif形式での保存も可能)
err = fc.SaveAs("dstImage.png", imgedit.Png)
if err != nil {
panic(err)
}
}
切り取り開始位置は画像の左上の位置を指定して下さい。
元画像の範囲外を選択すると、正常にトリム処理が出来ません。
サイズの指定は切り出したい画像のサイズを指定して下さい。
fc.SaveAs
の第二引数では以下の形式で保存するファイルの形式を選択出来ます。
imgedit.Png
imgedit.Jpeg
imgedit.Gif
画像のトリム処理(image取得)
main.go
package main
import (
"image"
"github.com/icemint0828/imgedit"
)
func main() {
// 切り取り開始位置の指定(px)
left, top := 100, 100
// サイズの指定(px)
width, height := 400, 400
// srcImgを何らかの方法で取得
var srcImg image.Image
// FileConverter
c := imgedit.NewConverter(srcImg)
// トリム
c.Trim(left, top, width, height)
dstImg := c.Convert()
// dstImgを使用
}
ファイルを介さずにimageを処理したい場合は、上記のようにimgedit.NewConverter
で直接画像の加工が出来ます。
パッケージ内の処理の説明
imgeditパッケージ内のconverter.go
でトリム処理を実施しています。
converter.go
// Trim trim the image to the specified size
func (c *converter) Trim(left, top, width, height int) {
dst := image.NewRGBA(image.Rect(0, 0, width, height))
dstSize := dst.Bounds().Size()
for x := 0; x < dstSize.X; x++ {
for y := 0; y < dstSize.Y; y++ {
srcX, srcY := x+left, y+top
dst.Set(x, y, c.Image.At(srcX, srcY))
}
}
c.Image = dst
}
引数からサイズを取得し、*image.RGBA
に対して、各ピクセルの色情報の書き込みしています。
書き込みをする際に元画像のx+left
, y+top
を参照することで左方向・上方向の切り抜きを実施し、その位置からのwidth
, height
を取ることで右方向・下方向の切り抜きを実施しています。
おわりに
簡単な内容とはなりますが、画像のトリム処理を紹介させて頂きました。
最後まで読んで頂き、ありがとうございました。