Open5
goで画像操作

go version go1.22.6 linux/amd64

ファイルサイズを出力
package main
import (
"fmt"
"image"
_ "image/png"
"os"
)
func main() {
// 読み込むPNGファイル名
filename := "Go-Logo_Aqua.png"
// ファイルを開く
file, err := os.Open(filename)
if err != nil {
fmt.Println("ファイルを開けません:", err)
return
}
defer file.Close()
// 画像をデコード
img, _, err := image.Decode(file)
if err != nil {
fmt.Println("画像をデコードできません:", err)
return
}
// 画像サイズを取得
bounds := img.Bounds()
width := bounds.Dx()
height := bounds.Dy()
// サイズを表示
fmt.Printf("画像サイズ: 幅=%dpx, 高さ=%dpx\n", width, height)
}
画像サイズ: 幅=1062px, 高さ=938px

リサイズする
参考
補完アルゴリズム
空のインスタンスを作り、アルゴリズムで変換した元画像を挿入するイメージ
package main
import (
"fmt"
"image"
"image/png"
"os"
"golang.org/x/image/draw"
)
func main() {
// リサイズするサイズ
resizeWidth := 200 // 幅
resizeHeight := 100 // 高さ
// 読み込むPNGファイル名
inputFilename := "Go-Logo_Aqua.png"
// 出力ファイル名(resize_ を付与)
outputFilename := "resize_" + inputFilename
// ファイルを開く
file, err := os.Open(inputFilename)
if err != nil {
fmt.Println("ファイルを開けません:", err)
return
}
defer file.Close()
// 画像をデコード
img, _, err := image.Decode(file)
if err != nil {
fmt.Println("画像をデコードできません:", err)
return
}
// 新しい画像キャンバスを作成
resizedImg := image.NewRGBA(image.Rect(0, 0, resizeWidth, resizeHeight))
// リサイズ処理
draw.CatmullRom.Scale(resizedImg, resizedImg.Bounds(), img, img.Bounds(), draw.Over, nil)
// 出力ファイルを作成
outFile, err := os.Create(outputFilename)
if err != nil {
fmt.Println("出力ファイルを作成できません:", err)
return
}
defer outFile.Close()
// PNG形式で保存
err = png.Encode(outFile, resizedImg)
if err != nil {
fmt.Println("画像を保存できません:", err)
return
}
fmt.Println("リサイズ完了!保存先:", outputFilename)
}

jpg対応
↑のコードをjpg画像に対して実行すると
画像をデコードできません: image: unknown format
となる
対応させるために
package main
import (
"fmt"
"image"
"image/jpeg"
"image/png"
"os"
"golang.org/x/image/draw"
)
func main() {
// 読み込むファイル名
inputFilename := "Go-Logo_Aqua.jpg" // PNG, JPEG対応
// 出力ファイル名(resize_ を付与)
outputFilename := "resize_" + inputFilename
// リサイズするサイズ(可変)
resizeWidth := 200 // 幅を200pxに
resizeHeight := 100 // 高さを100pxに
// ファイルを開く
file, err := os.Open(inputFilename)
if err != nil {
fmt.Println("ファイルを開けません:", err)
return
}
defer file.Close()
// 画像をデコード
img, format, err := image.Decode(file)
if err != nil {
fmt.Println("画像をデコードできません:", err)
return
}
fmt.Println("画像フォーマット:", format)
// 新しい画像キャンバスを作成
resizedImg := image.NewRGBA(image.Rect(0, 0, resizeWidth, resizeHeight))
// リサイズ処理
draw.CatmullRom.Scale(resizedImg, resizedImg.Bounds(), img, img.Bounds(), draw.Over, nil)
// 出力ファイルを作成
outFile, err := os.Create(outputFilename)
if err != nil {
fmt.Println("出力ファイルを作成できません:", err)
return
}
defer outFile.Close()
// 画像をフォーマットに応じて保存
switch format {
case "png":
err = png.Encode(outFile, resizedImg)
case "jpeg":
err = jpeg.Encode(outFile, resizedImg, nil)
default:
fmt.Println("未対応のフォーマットです")
return
}
if err != nil {
fmt.Println("画像を保存できません:", err)
return
}
fmt.Println("リサイズ完了!保存先:", outputFilename)
}
とします
# pngの場合
画像フォーマット: png
リサイズ完了!保存先: resize_Go-Logo_Aqua.png
# jpgの場合
画像フォーマット: jpeg
リサイズ完了!保存先: resize_Go-Logo_Aqua.jpg

フォーマットについて
imageライブラリでは
- png
- jpg
- gif
に対応している様子
それ以外のフォーマットは
を使えばよさそう