golangで画像いじりなど

golangで画像をいろいろ弄ります。

画像を読み込んでサイズを表示

標準のimageパッケージを使います。

package main

import (
    "os"
    "log"
    "image"
    _ "image/jpeg"
    // 画像の種類によって追加
    _ "image/png"
    _ "image/gif"
)

func main(){
    // 画像読み込み
    file, err := os.Open(./image.jpg)
    if err != nil{
        log.Fatalln(err)
    }
    defer file.Close()
    
    // 
    imgConfig, _, err := image.DecodeConfig(file)
    if err != nil{
        log.Fatalln(err)
    }
    log.Printf("image width: %d, height: %d",imgConfig.Width, imgConfig.Height)

}

実行結果

2014/07/28 00:00:00 image width:2560, height:1920

画像をリサイズして書き出し

github.com/nfnt/resizeを使います。

package main

import (
    "os"
    "log"
    "image/jpeg"

    "github.com/nfnt/resize"
)

func main(){
    // 元画像読み込み
    file, err := os.Open("./image.jpg")
    if err != nil{
        log.Fatalln(err)
    }
    // io.Readerからimage.Imageに変換
    img, err := jpeg.Decode(file)
    if err != nil{
        log.Fatalln(err)
    }
    file.Close()

    // サイズとアルゴリズムを指定
    // 片方のサイズを0にするとアスペクト比固定してくれます
    m := resize.Resize(100, 0, img, resize.NearestNeighbor)
    // 書き出しファイル指定
    out, err := os.Create("./resized_image.jpg")
    if err != nil{
        log.Fatalln(err)
    }
    // メソッド終了でファイルを閉じる
    defer out.Close()
    // 書き込み
    jpeg.Encode(out, m, nil)

}

実行結果

処理前

panda

処理後

resized_panda

Exifの読み込み

github.com/rwcarlsen/goexifを使います。

package main

import (
    "os"
    "log"

    "github.com/rwcarlsen/goexif/exif"
)

func main(){
    // 画像読み込み
    file, err := os.Open("./image.jpg")
    if err != nil{
        log.Fatalln(err)
    }
    // 画像データをexifデータに変換
    exifData, err := exif.Decode(file)
    if err != nil{
        log.Fatalln(err)
    }
    defer file.Close()
    // 一覧で表示
    log.Println(exifData)

    // 個別に取得して表示
    camModel, err := exifData.Get(exif.Model)
    if err != nil{
        log.Fatalln(err)
    }
    log.Println(camModel.StringVal())
}                                                                    

実行結果

2014/07/28 0:00:00 InteroperabilityIndex: {Id: 1, Val: "R98"}
ApertureValue: {Id: 9202, Val: ["252/100"]}
InteroperabilityIFDPointer: {Id: A005, Val: [432]}
ShutterSpeedValue: {Id: 9201, Val: ["4907/1000"]}
ColorSpace: {Id: A001, Val: [1]}
Make: {Id: 10F, Val: "LGE"}
ExposureBiasValue: {Id: 9204, Val: ["0/6"]}
PixelYDimension: {Id: A003, Val: [3264]}
FNumber: {Id: 829D, Val: ["240/100"]}
YResolution: {Id: 11B, Val: ["72/1"]}
ResolutionUnit: {Id: 128, Val: [2]}
ThumbJPEGInterchangeFormat: {Id: 201, Val: [594]}
ComponentsConfiguration: {Id: 9101, Val: ""}
ISOSpeedRatings: {Id: 8827, Val: [326]}
FocalLength: {Id: 920A, Val: ["397/100"]}
DateTimeDigitized: {Id: 9004, Val: "2014:04:03 22:52:36"}
ExposureTime: {Id: 829A, Val: ["1/30"]}
GPSImgDirectionRef: {Id: 10, Val: "M"}
Flash: {Id: 9209, Val: [0]}
GPSImgDirection: {Id: 11, Val: ["93/1"]}
GPSInfoIFDPointer: {Id: 8825, Val: [462]}
Model: {Id: 110, Val: "Nexus 5"}
XResolution: {Id: 11A, Val: ["72/1"]}
ThumbJPEGInterchangeFormatLength: {Id: 202, Val: [16680]}
ExifVersion: {Id: 9000, Val: "0220"}
PixelXDimension: {Id: A002, Val: [2448]}
ExifIFDPointer: {Id: 8769, Val: [134]}
YCbCrPositioning: {Id: 213, Val: [1]}
DateTimeOriginal: {Id: 9003, Val: "2014:04:03 22:52:36"}
FlashpixVersion: {Id: A000, Val: "0100"}

2014/07/28 0:00:00 Nexus 5