LoginSignup
20
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-12-03

はじめに

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関数が呼び出されます。

20
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
2