mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-11 10:23:44 +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,18 @@
|
||||
# examples/ili9341/slideshow
|
||||
|
||||

|
||||
|
||||
This example uses the image package for TinyGo to display png and jpeg images.
|
||||
|
||||
## How to create an image
|
||||
|
||||
The following program will output an image binary like the one in [images.go](./images.go).
|
||||
|
||||
```
|
||||
go run ./examples/ili9341/slideshow/convert2bin ./path/to/png_or_jpg.png
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
Displaying a 320x240 png or jpeg often requires more than 50KB of memory.
|
||||
The examples include samd21 settings, but if you run them as is, you will get a memory size error.
|
||||
@@ -0,0 +1,29 @@
|
||||
// +build atsamd21
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"machine"
|
||||
|
||||
"tinygo.org/x/drivers/ili9341"
|
||||
)
|
||||
|
||||
var (
|
||||
display = ili9341.NewSPI(
|
||||
machine.SPI0,
|
||||
machine.D0,
|
||||
machine.D1,
|
||||
machine.D2,
|
||||
)
|
||||
|
||||
backlight = machine.D3
|
||||
)
|
||||
|
||||
func init() {
|
||||
machine.SPI0.Configure(machine.SPIConfig{
|
||||
SCK: machine.SPI0_SCK_PIN,
|
||||
SDO: machine.SPI0_SDO_PIN,
|
||||
SDI: machine.SPI0_SDI_PIN,
|
||||
Frequency: 24000000,
|
||||
})
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// +build pyportal
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"machine"
|
||||
|
||||
"tinygo.org/x/drivers/ili9341"
|
||||
)
|
||||
|
||||
var (
|
||||
display = ili9341.NewParallel(
|
||||
machine.LCD_DATA0,
|
||||
machine.TFT_WR,
|
||||
machine.TFT_DC,
|
||||
machine.TFT_CS,
|
||||
machine.TFT_RESET,
|
||||
machine.TFT_RD,
|
||||
)
|
||||
|
||||
backlight = machine.TFT_BACKLIGHT
|
||||
)
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
@@ -0,0 +1,29 @@
|
||||
// +build wioterminal
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"machine"
|
||||
|
||||
"tinygo.org/x/drivers/ili9341"
|
||||
)
|
||||
|
||||
var (
|
||||
display = ili9341.NewSPI(
|
||||
machine.SPI3,
|
||||
machine.LCD_DC,
|
||||
machine.LCD_SS_PIN,
|
||||
machine.LCD_RESET,
|
||||
)
|
||||
|
||||
backlight = machine.LCD_BACKLIGHT
|
||||
)
|
||||
|
||||
func init() {
|
||||
machine.SPI3.Configure(machine.SPIConfig{
|
||||
SCK: machine.LCD_SCK_PIN,
|
||||
SDO: machine.LCD_SDO_PIN,
|
||||
SDI: machine.LCD_SDI_PIN,
|
||||
Frequency: 40000000,
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user