Edited at
Tech DoDay 4

【Go言語のimageパッケージと戯れる】第1回:画像ファイルを読み込む


はじめに

Go超初心者がデフォルトパッケージを使ってみただけの内容です。

間違っている部分があれば優しく教えてください。


Goのimageパッケージでできること

ざっくりと、以下のようなものが扱えるようです。


  • アルファ値

  • 色空間とグレースケール

  • png/jpeg/gif画像

もっと具体的にどんなことができるのか、公式資料を見るだけではよくわからないので、とにかく使ってみます。


画像を読み込み

画像の読み込みはosパッケージを使います。

file, _ := os.Open("{ファイルパス}")


画像情報の出力

今回は、読み込んだ画像の「フォーマット」と「サイズ」を出力してみます。

imageパッケージの DecodeConfig 関数を使うことで、これらの情報を取得できます。

config, formatName, err := image.DecodeConfig(file)


jpegファイルを読み込み、フォーマットとサイズ情報を出力する


main.go

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関数の中身は下記のように定義されています。


image/jpeg/reader.go

func init() {

image.RegisterFormat("jpeg", "\xff\xd8", Decode, DecodeConfig)
}

そのため、_ "image/jpeg"をimportすると、RegisterFormat関数が呼び出されます。