This is an image package that uses less RAM to run on a microcontroller. Unlike Go's original image package, image.Decode() does not return image.Image.
Instead, a callback can be set to process the data corresponding to the image.
First, use SetCallback() to set the callback. Then call png.Decode() or jpeg.Decode(). The callback will be called as many times as necessary to load the image.
SetCallback() needs to be given a Buffer to handle the callback and the actual function to be called. The data []uint16 in the callback is in RGB565 format.
The io.Reader to pass to Decode() specifies the binary data of the image.
func drawPng(display *ili9341.Device) error { p := strings.NewReader(pngImage) png.SetCallback(buffer[:], func(data []uint16, x, y, w, h, width, height int16) { err := display.DrawRGBBitmap(x, y, data[:w*h], w, h) if err != nil { errorMessage(fmt.Errorf("error drawPng: %s", err)) } }) return png.Decode(p) }func drawJpeg(display *ili9341.Device) error { p := strings.NewReader(jpegImage) jpeg.SetCallback(buffer[:], func(data []uint16, x, y, w, h, width, height int16) { err := display.DrawRGBBitmap(x, y, data[:w*h], w, h) if err != nil { errorMessage(fmt.Errorf("error drawJpeg: %s", err)) } }) return jpeg.Decode(p) }The following program will output an image binary like the one in images.go.
go run ./cmd/convert2bin ./path/to/png_or_jpg.png An example can be found below. Processing jpegs requires a minimum of 32KB of RAM.