Go Playground でお絵描き
全国緊急事態宣言の折,皆様いかがお過ごしでしょうか。 完全失業中の私は,家族からは白い目で見られ,かといって気晴らしの外出も自粛ムードでままならず,涙目状態です。 どなたか松江で仕事ください。
というわけで,今回はストレス発散な話。 つかですね,
という記事を見て自分でも試してみようかな,と。
Go Playground で Display image
を選択すると以下のコードが表示され,実行すると favicon 画像データが表示される。
画像表示の核心部分は以下のコードのようだ。
// displayImage renders an image to the playground's console by
// base64-encoding the encoded image and printing it to stdout
// with the prefix "IMAGE:".
func displayImage(m image.Image) {
var buf bytes.Buffer
err := png.Encode(&buf, m)
if err != nil {
panic(err)
}
fmt.Println("IMAGE:" + base64.StdEncoding.EncodeToString(buf.Bytes()))
}
image
.Image
インスタンスを PNG 形式でエンコードし,さらに BASE64 形式で文字符号化する。
これに "IMAGE:"
を頭にくっつけて「表示」すればいいようだ。
当然ながら Go Playground 特有の機能なので,他の環境では機能しない(機能されては困るw
)。
リモートのファイルを表示できれば面白かったのだが,残念ながら Go Playground では TCP/IP によるリモートアクセスが潰されている(まぁアクセスできたら踏み台し放題になっちゃうからしないんだろうけど)。
そこで画像データをあらかじめ文字列符号化してソースコードに埋め込めば
var imageFromBase64 = `...`
func getimage() (image.Image, error) {
img, _, err := image.Decode(base64.NewDecoder(base64.StdEncoding, strings.NewReader(imageFromBase64)))
return img, err
}
func main() {
img, err := getimage()
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
displayImage(img)
}
てな感じで任意の画像を表示できるだろう1。 たとえば,こんな感じ。
ここで画像データのスケール変換をやってみる。
以前書いた「Go 言語で画像のサイズ変更:定義済み draw.Scaler の比較」を参考に main()
関数を以下のように書き換える。
func scale(src image.Image, rect image.Rectangle, scaler draw.Scaler) image.Image {
dst := image.NewRGBA(rect)
scaler.Scale(dst, rect, src, src.Bounds(), draw.Over, nil)
return dst
}
func main() {
img, err := getimage()
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
//scale down
displayImage(scale(img, image.Rect(0, 0, 80, 80), draw.NearestNeighbor))
}
いちばん(速くて)変換性能が悪い draw
.NearestNeighbor
を使ってみた(笑)
結果はこんな感じ。
よーし,うむうむ,よーし。
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
-
大きな画像を Go Playground で表示しようとすると失敗(タイムアウト?)する場合がある。また複数の画像は表示できないっぽい。 ↩︎