最近業務で画像のデータを使って〜する場面があったのですが、サーバー上にある画像がフォルダごとに分かれてしまっていたり、階層もばらばらだったりと不便だったので、ちょっとした効率化ツールを作ってみました。
使っているのはGo言語です。
ソースコード
package main
import (
"image"
"image/jpeg"
"image/png"
"log"
"os"
"path/filepath"
)
const imgQt int = 60
func main() {
// 実行ファイル直下のパスを取得
path, _ := os.Getwd()
dataPath := filepath.Join(path, "data")
dataAllPath := filepath.Join(dataPath, "*")
list, _ := filepath.Glob(dataAllPath)
var textList []string
// 画像を1枚づつ読み込む
for _, item := range list {
textList = append(textList, readItem(item)...)
}
for _, text := range textList {
exc(text)
}
}
func exc(text string) {
path, _ := os.Getwd()
outputPath := filepath.Join(path, "result")
println(text)
// 画像を読み込む
img := input(text)
if img == nil {
return
}
out := filepath.Join(outputPath, filepath.Base(text))
output(img, out, "jpg")
}
func readItem(item string) []string {
fInfo, _ := os.Stat(item)
var text []string
if fInfo.IsDir() {
itemList := filepath.Join(item, "*")
list, _ := filepath.Glob(itemList)
for _, l := range list {
// 再帰処理
text = append(text, readItem(l)...)
}
} else {
text = append(text, item)
}
return text
}
// 画像を読み込む処理
func input (filePath string) image.Image {
// 画像を読み込む
file, err := os.Open(filePath)
if err != nil {
println(err)
return nil
}
// 変換
img, _, err := image.Decode(file)
return img
}
func output (outputImage image.Image, filePath string, format string) {
dst, err := os.Create(filePath)
if err != nil {
log.Fatal(err)
}
switch format {
case "png":
// PNGの場合
err = png.Encode(dst, outputImage)
if err != nil {
log.Fatal(err)
}
break
case "jpg":
// JPGの場合
qt := jpeg.Options{
Quality:imgQt,
}
err = jpeg.Encode(dst, outputImage, &qt)
if err != nil {
log.Fatal(err)
}
break
case "gif":
// GIFの場合
log.Println("can't output gif")
break
default:
// 標準で対応していないフォーマットの場合
println("no file")
break
}
}
実行ファイルと同じ階層にdataフォルダ、resultフォルダを作っています。
dataフォルダ直下にはフォルダ分かれ、階層分かれした画像データが入っているフォルダを丸々入れてもらえれば、resultフォルダに画像が出力されると思います。
こういうちょっとしたツールを作りやすいのがGo言語の良いところですね。