Go Playground でお絵描き

全国緊急事態宣言の折,皆様いかがお過ごしでしょうか。 完全失業中の私は,家族からは白い目で見られ,かといって気晴らしの外出も自粛ムードでままならず,涙目状態です。 どなたか松江で仕事ください。

というわけで,今回はストレス発散な話。 つかですね,

という記事を見て自分でも試してみようかな,と。

Go PlaygroundDisplay image を選択すると以下のコードが表示され,実行すると favicon 画像データが表示される。

Display image: The Go Playground

画像表示の核心部分は以下のコードのようだ。

// 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。 たとえば,こんな感じ。

Display image: The Go Playground

ここで画像データのスケール変換をやってみる。 以前書いた「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 を使ってみた(笑)

結果はこんな感じ。

Display image: The Go Playground

よーし,うむうむ,よーし。

ブックマーク

参考図書

photo
プログラミング言語Go
アラン・ドノバン (著), ブライアン・カーニハン (著), 柴田芳樹 (著)
丸善出版 2016-06-20 (Release 2021-07-13)
Kindle版
B099928SJD (ASIN)
評価     

Kindle 版出た! 一部内容が古びてしまったが,この本は Go 言語の教科書と言ってもいいだろう。感想はこちら

reviewed by Spiegel on 2021-05-22 (powered by PA-APIv5)


  1. 大きな画像を Go Playground で表示しようとすると失敗(タイムアウト?)する場合がある。また複数の画像は表示できないっぽい。 ↩︎