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)
}
実行結果
処理前
処理後
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