Open5

goで画像操作

not75743not75743

ファイルサイズを出力

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
not75743not75743

リサイズする

参考
https://blanktar.jp/blog/2024/01/golang-resize-image

補完アルゴリズム
https://cs.opensource.google/go/x/image/+/refs/tags/v0.23.0:draw/scale.go;l=177

空のインスタンスを作り、アルゴリズムで変換した元画像を挿入するイメージ

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)
}

not75743not75743

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