🦁

Go言語でJPG画像をPNGに変換する

2024/02/19に公開

概要

今回はgo言語で画像の拡張子jpgからpngへの変換を実装してみた。

実際のコード

converter.go

package converter

import (
	"fmt"
	"image"
	_ "image/jpeg" 
	"image/png"    
	"os"
	"path/filepath"
)

type Converter struct{}

func NewConverter() *Converter {
	return &Converter{}
}

func (c *Converter) ConvertJPGToPNG(dir string) error {
	return filepath.Walk(dir, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return fmt.Errorf("error walking through directory: %v", err)
		}
		if !info.IsDir() && filepath.Ext(path) == ".jpg" {
			return convertToPNG(path)
		}
		return nil
	})
}

func convertToPNG(filePath string) error {
	file, err := os.Open(filePath)
	if err != nil {
		return fmt.Errorf("error opening file %s: %v", filePath, err)
	}
	defer file.Close()

	img, _, err := image.Decode(file)
	if err != nil {
		return fmt.Errorf("error decoding JPG file %s: %v", filePath, err)
	}

	outputPath := filePath[:len(filePath)-len(filepath.Ext(filePath))] + ".png"
	outFile, err := os.Create(outputPath)
	if err != nil {
		return fmt.Errorf("error creating PNG file %s: %v", outputPath, err)
	}
	defer outFile.Close()

	if err := png.Encode(outFile, img); err != nil {
		return fmt.Errorf("error encoding file to PNG %s: %v", outputPath, err)
	}

	return nil
}

main.go

package main

import (
	"fmt"
	"os"
	"convert/converter" // 自作パッケージのインポート
)

func main() {
	if len(os.Args) < 2 {
		fmt.Println("error: invalid argument")
		return
	}

	dir := os.Args[1]
	if _, err := os.Stat(dir); os.IsNotExist(err) {
		fmt.Printf("error: %s: no such file or directory\n", dir)
		return
	}

	c := converter.NewConverter()
	err := c.ConvertJPGToPNG(dir)
	if err != nil {
		fmt.Printf("error: %s\n", err.Error())
	}
}

コードの解説

Converter型

Converterは、画像形式の変換を行うための型であり、この型にはメソッドが定義されており、そのメソッドを通じてJPGファイルをPNGファイルに変換することができる。

NewConverter関数

NewConverter関数は、Converter型の新しいインスタンスを作成して返すことでConverter型の機能を使用して画像の変換を行う。

ConvertJPGToPNGメソッド

このメソッドは、指定されたディレクトリ内のすべてのJPGファイルをPNGファイルに変換する。具体的には、filepath.Walk関数を使用してディレクトリ内を再帰的に走査し、見つかった各JPGファイルに対してconvertToPNG関数を呼び出して変換を行う。

convertToPNG関数

convertToPNG関数は、単一のJPGファイルをPNGファイルに変換する。まずファイルを開き、image.Decode関数を使用してJPGファイルから画像データをデコードする。次に、出力ファイル名を生成し、PNG形式でエンコードしてファイルに書き込む。

実行結果

jpgからpngに変換されていることがわかる

参考記事

https://pkg.go.dev/image/jpeg
https://pkg.go.dev/image

Discussion