🦁
Go言語でJPG画像をPNGに変換する
概要
今回は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に変換されていることがわかる
参考記事
Discussion