はじめに
Go超初心者がデフォルトパッケージを使ってみただけの内容です。
間違っている部分があれば優しく教えてください。
Goのimageパッケージでできること
ざっくりと、以下のようなものが扱えるようです。
- アルファ値
- 色空間とグレースケール
- png/jpeg/gif画像
もっと具体的にどんなことができるのか、公式資料を見るだけではよくわからないので、とにかく使ってみます。
画像を読み込み
画像の読み込みはosパッケージを使います。
file, _ := os.Open("{ファイルパス}")
画像情報の出力
今回は、読み込んだ画像の「フォーマット」と「サイズ」を出力してみます。
imageパッケージの DecodeConfig
関数を使うことで、これらの情報を取得できます。
config, formatName, err := image.DecodeConfig(file)
jpegファイルを読み込み、フォーマットとサイズ情報を出力する
package main
import (
"fmt"
"image"
_ "image/jpeg"
"log"
"os"
"strconv"
)
func main() {
//画像ファイルを開く
file, _ := os.Open("C://Users/user_name/Desktop/test.jpeg")
defer file.Close()
//設定をデコード
config, format, err := image.DecodeConfig(file)
if err != nil {
log.Fatal(err)
}
//フォーマット名表示
fmt.Println("画像フォーマット:" + format)
//サイズ表示
fmt.Println("横幅=" + strconv.Itoa(config.Width) + ", 縦幅=" + strconv.Itoa(config.Height))
}
実行結果
C:\Users\user_name\go\src\picture>go run main.go
画像フォーマット:jpeg
横幅=968, 縦幅=726
RegisterFormat関数
imageパッケージのRegisterFormat
関数を使用することで、
jpegをデコードで使用する画像フォーマットとして登録しています。
ここで、「ん?RegisterFormat関数なんて、ソースコード上で使っていないじゃないか!!!!」となりますよね。
実は、_ "image/jpeg"
をimportする際に、RegisterFormat関数を使用しています。
そのため、_ "image/jpeg"
をimport宣言から削除し、実行すると下記のようなエラーが出力されます。
C:\Users\user_name\go\src\picture>go run main.go
2018/12/02 22:55:34 image: unknown format
exit status 1
もちろん、_ "image/jpeg"
の代わりに_ "image/png"
をimportしても、同様のエラーが発生します。
import宣言でのアンダースコア?
import宣言での_(アンダースコア)は、ブランク識別子と呼ばれます。
Go言語ではimportしたパッケージをコード内で使用しないとコンパイルエラーとなりますが
ブランク識別子を利用することで、依存関係を解決するためのimportであることを明示することができます。
また、ブランク識別子を利用すると、パッケージの中の関数は直接使わず
このパッケージの中にあるinit関数をコールします。
今回、実際に呼ばれているinit関数の中身は下記のように定義されています。
func init() {
image.RegisterFormat("jpeg", "\xff\xd8", Decode, DecodeConfig)
}
そのため、_ "image/jpeg"
をimportすると、RegisterFormat関数が呼び出されます。