Help us understand the problem. What is going on with this article?

goでたくさんの画像のサイズを小さくしたい!!!!

はじめに

こんにちはRIN1208です。
本日はクリスマスイブですね!!自分は特に予定がなく部屋で過ごしてチキンを食べました!悲しい....
この記事は画像のサイズ圧縮をかなりの量をしなくてはいけなくなったのでその制作の途中経過です(深刻なアドベントカレンダーのネタ不足....)

またこの記事はITRCアドベントカレンダーの24日目の記事になります。

開発環境

  • mac
  • goの実行環境

今回使用したパッケージ

  • github.com/google/uuid
    uuidを使うために使用しました
    GitHub
  • github.com/nfnt/resize
    画像のサイズを変更するのに使用しました
    GitHub

インストール

$ go get github.com/google/uuid
$ go get github.com/nfnt/resize

今回のコード(下で順々に解説します)

package main

import (
    "image"
    "image/jpeg"
    "image/png"
    "io/ioutil"
    "log"
    "os"

    "github.com/google/uuid"
    "github.com/nfnt/resize"
)

func main() {

    files, _ := ioutil.ReadDir("./image")
    for _, f := range files {
        save_image("./image/" + f.Name())
    }

}

func save_image(filename string) {

    path := "./datas/"  //保存先のディレクトリ名になります。現時点のコードでは既に作成していないとエラーが出ます


    uuid := create_uuid() //こちらの部分は後ほど解説します

    file, err := os.Open(filename)
    if err != nil {
        log.Fatal(err)
    }
    img, data, err := image.Decode(file)
    if err != nil {
        log.Fatal(err)
    }
    file.Close()
    m := resize.Resize(1000, 0, img, resize.Lanczos3)

    if data == "png" {
        out, err := os.Create(path + uuid + ".png")
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        png.Encode(out, m)
    } else if data == "jpeg" {
        out, err := os.Create(path + uuid + ".jpeg")
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        jpeg.Encode(out, m, nil)
    }

}

func create_uuid() string {
    u, _ := uuid.NewRandom()
    uuid := u.String()
    return uuid
}

特に難しいことはしてないでです

コードの解説

main()の部分

    files, _ := ioutil.ReadDir("./image")
    for _, f := range files {
        save_image("./image/" + f.Name())
    }

ここではimageディレクト下の画像のファイル名を取得しsave_image()関数に画像ファイルのパスを渡しています。

save_image()の部分は下で説明します。

save_image()の部分

画像のリサイズは以下の部分でしています。数値を変更するとサイズも変更されます。

m := resize.Resize(1000, 0, img, resize.Lanczos3)

こちらの部分は取得した画像がpngならpng、jpegならjpegで保存するようにしています

    if data == "png" {
        out, err := os.Create(path + uuid + ".png")
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        png.Encode(out, m)
    } else if data == "jpeg" {
        out, err := os.Create(path + uuid + ".jpeg")
        if err != nil {
            log.Fatal(err)
        }
        defer out.Close()
        jpeg.Encode(out, m, nil)
    }

create_uuid()の部分

ここに関しては特に説明するとがないですが今回使用した理由としては大量の画像のためファイル名がかぶらないようにしたかったので使用しました。(名前は適当でよかったので)

終わりに

ここまで読んでいただきありがとうございます。今回ここに書いてあるのは制作途中にの物でありこれから並列処理を使用して大量の画像を処理していく予定です。

rin1208
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした