LoginSignup
3
0

More than 3 years have passed since last update.

フォルダごとに分かれている画像を一箇所に集める

Posted at

最近業務で画像のデータを使って〜する場面があったのですが、サーバー上にある画像がフォルダごとに分かれてしまっていたり、階層もばらばらだったりと不便だったので、ちょっとした効率化ツールを作ってみました。

使っているのは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言語の良いところですね。

3
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
3
0