mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-20 06:28:59 +00:00
image: add support for image/jpeg and image/png (#303)
* Copy from go1.17 image package * Remove unnecessary files * Reduce memory usage * Add examples/ili9341/slideshow * image: add ./image/README.md * image: change convert2bin to . /cmd * Makefile: add ./cmd to NOTEST
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"image/color"
|
||||
"machine"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"tinygo.org/x/drivers/ili9341"
|
||||
"tinygo.org/x/drivers/image/jpeg"
|
||||
"tinygo.org/x/drivers/image/png"
|
||||
)
|
||||
|
||||
var (
|
||||
black = color.RGBA{0, 0, 0, 255}
|
||||
white = color.RGBA{255, 255, 255, 255}
|
||||
red = color.RGBA{255, 0, 0, 255}
|
||||
blue = color.RGBA{0, 0, 255, 255}
|
||||
green = color.RGBA{0, 255, 0, 255}
|
||||
)
|
||||
|
||||
func main() {
|
||||
err := run()
|
||||
for err != nil {
|
||||
errorMessage(err)
|
||||
}
|
||||
}
|
||||
|
||||
func run() error {
|
||||
backlight.Configure(machine.PinConfig{machine.PinOutput})
|
||||
|
||||
display.Configure(ili9341.Config{})
|
||||
|
||||
width, height := display.Size()
|
||||
if width < 320 || height < 240 {
|
||||
display.SetRotation(ili9341.Rotation270)
|
||||
}
|
||||
|
||||
display.FillScreen(black)
|
||||
backlight.High()
|
||||
|
||||
for {
|
||||
err := drawJpeg(display)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
|
||||
err = drawPng(display)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
time.Sleep(time.Second)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Define the buffer required for the callback. In most cases, this setting
|
||||
// should be sufficient. For jpeg, the callback will always be called every
|
||||
// 3*8*8*4 pix. png will be called every line, i.e. every width pix.
|
||||
var buffer [3 * 8 * 8 * 4]uint16
|
||||
|
||||
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)
|
||||
}
|
||||
|
||||
func errorMessage(err error) {
|
||||
for {
|
||||
fmt.Printf("%s\r\n", err.Error())
|
||||
time.Sleep(5 * time.Second)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user