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.