1 Star 0 Fork 1

VENTIM / 22.7 esp32cam多功能摄像机

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
esp32cam_TFT3 刚好大小、DMA顺畅显示.txt 44.07 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
/*
*
*FRAMESIZE_QVGA (320 x 240)
FRAMESIZE_CIF (352 x 288)
FRAMESIZE_VGA (640 x 480)
FRAMESIZE_SVGA (800 x 600)
FRAMESIZE_XGA (1024 x 768)
FRAMESIZE_SXGA (1280 x 1024)
FRAMESIZE_UXGA (1600 x 1200)
*/
//1 文字图形ok
//2 拍照显示到tft,周期显示特定图片。 显示缩放0.5和左上拍摄图片 相关函数
// 》有时正常,有时显示拍照的图片不完整
//3 拍照设置为160x120,尝试改善刷屏的屏闪 使用DMA方式 测试原装板子,运行正常 刚好大小的 1张图43ms
//现在tft的引脚连接: 在tft的User_Setup.h里
//#define TFT_MOSI 13 固定
//#define TFT_SCLK 14 固定
//#define TFT_CS 15 //可省略 片选 可接地持续运行
//#define TFT_DC 2 //1数据 0命令
//#define TFT_RST 12 //可省略 低电平复位 可连接esp32复位引脚,上电复位
//SD卡占用引脚: 剩余引脚: 串口(1、3),0,16(spram占用) 33(adc做多按键!)
//HS2_DATA0 2 spi-MISO
//HS2_DATA1 4 可省略
//HS2_DATA2 12 可省略
//HS2_DATA3 13 spi-SS
//HS2_CMD 15 spi-MOSI
//HS2_CLK 14 spi-SCK
/*#########################
Taking picture...
Camera capture ok
===============
JPEG image info
===============
Width :320
Height :240
Components :1
MCU / row :20
MCU / col :30
Scan type :2
MCU width :16
MCU height :8
===============
Total render time was : 80 ms
#########################
Mouse 1
===============
JPEG image info
===============
Width :160
Height :107
Components :1
MCU / row :10
MCU / col :7
Scan type :4
MCU width :16
MCU height :16
===============
Total render time was : 51 ms
*/
const uint8_t Mouse160[] PROGMEM = {
0xFF,0xD8,0xFF,0xE0,0x00,0x10,0x4A,0x46,0x49,0x46,0x00,0x01,0x01,0x01,0x00,0x48,0x00,0x48,0x00,0x00,0xFF,0xDB,0x00,0x43,0x00,0x04,0x03,0x03,0x03,0x03,0x02,0x04,
0x03,0x03,0x03,0x04,0x04,0x04,0x05,0x06,0x0A,0x06,0x06,0x05,0x05,0x06,0x0C,0x08,0x09,0x07,0x0A,0x0E,0x0C,0x0F,0x0E,0x0E,0x0C,0x0D,0x0D,0x0F,0x11,0x16,0x13,0x0F,
0x10,0x15,0x11,0x0D,0x0D,0x13,0x1A,0x13,0x15,0x17,0x18,0x19,0x19,0x19,0x0F,0x12,0x1B,0x1D,0x1B,0x18,0x1D,0x16,0x18,0x19,0x18,0xFF,0xDB,0x00,0x43,0x01,0x04,0x04,
0x04,0x06,0x05,0x06,0x0B,0x06,0x06,0x0B,0x18,0x10,0x0D,0x10,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0xFF,0xC0,
0x00,0x11,0x08,0x00,0x6B,0x00,0xA0,0x03,0x01,0x22,0x00,0x02,0x11,0x01,0x03,0x11,0x01,0xFF,0xC4,0x00,0x1D,0x00,0x00,0x02,0x03,0x00,0x03,0x01,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x05,0x03,0x06,0x07,0x00,0x02,0x08,0x01,0x09,0xFF,0xC4,0x00,0x3B,0x10,0x00,0x02,0x01,0x02,0x04,0x04,0x04,0x04,0x04,0x05,0x03,
0x04,0x03,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x11,0x00,0x05,0x12,0x21,0x06,0x13,0x31,0x41,0x22,0x51,0x61,0x71,0x07,0x14,0x81,0x91,0x23,0x32,0xA1,0xB1,0x08,0x15,
0x33,0x42,0xD1,0x52,0x62,0xC1,0x16,0x24,0x43,0xF1,0x82,0xB2,0xE1,0xFF,0xC4,0x00,0x19,0x01,0x00,0x03,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x02,0x03,0x01,0x04,0x05,0xFF,0xC4,0x00,0x22,0x11,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,
0x11,0x03,0x21,0x31,0x41,0x12,0x13,0x22,0x51,0x04,0x14,0x32,0xFF,0xDA,0x00,0x0C,0x03,0x01,0x00,0x02,0x11,0x03,0x11,0x00,0x3F,0x00,0xF5,0x73,0xE6,0xCF,0x96,0xC7,
0x24,0xF9,0xDE,0x4F,0x48,0xF0,0xAD,0xAF,0x51,0x08,0x04,0x93,0x7F,0xF4,0x9D,0xFF,0x00,0x5C,0x34,0xC8,0xF8,0x9F,0x85,0xB3,0x88,0xD9,0x32,0xF9,0xA0,0x59,0x10,0xF8,
0xE0,0x91,0x02,0x3A,0xF9,0x1B,0x10,0x36,0x3E,0x78,0x97,0xE4,0xA0,0x9C,0xAB,0xC9,0x1A,0x4C,0xAA,0x06,0x9B,0x81,0x6B,0x7A,0x8F,0x2C,0x52,0x33,0x9E,0x08,0xA7,0x35,
0x72,0xD5,0x65,0xB2,0xF2,0x27,0x6B,0xAF,0x2F,0x70,0x42,0xF9,0x7B,0x6E,0x77,0xC6,0xA9,0xC9,0x6B,0xA2,0x6F,0x1F,0xD1,0xA7,0x2D,0x2D,0x23,0x0B,0xAC,0x31,0x91,0xE6,
0x14,0x60,0x5A,0x8C,0xBB,0x2F,0xA8,0x3F,0x89,0x49,0x13,0x8B,0x5B,0xC4,0x83,0x1E,0x3B,0x3F,0x1E,0x38,0xEB,0xE1,0x5F,0xC4,0x9A,0xEE,0x1C,0xE2,0x06,0xFE,0x79,0x95,
0xC3,0x51,0xA2,0xCC,0x2D,0x2A,0xA1,0xB5,0xAC,0xC4,0xDC,0xD8,0x1E,0xF8,0xF4,0xAE,0x49,0xC4,0xF5,0x5C,0x65,0xC2,0x74,0x39,0xED,0x04,0x13,0x53,0xD1,0xD6,0x46,0x25,
0x55,0x94,0x69,0x76,0x53,0xD2,0xF6,0xE8,0x3B,0xE2,0x9E,0xC8,0xC5,0x09,0xEB,0x61,0x3C,0x49,0x94,0x64,0x52,0xE5,0x52,0x51,0x24,0x14,0x8B,0x23,0x0B,0x10,0xAA,0x09,
0x02,0xFB,0xF4,0xC7,0x29,0x68,0xF8,0x6A,0x99,0x56,0x9E,0x08,0xA9,0x14,0x84,0x1F,0xF8,0xC2,0x93,0xFA,0x62,0x1A,0xA8,0xF9,0x04,0x34,0x8A,0xF1,0x93,0x72,0x34,0xAD,
0xC8,0x18,0xAF,0x57,0x51,0x4F,0x23,0xBB,0xBA,0x94,0x36,0xDA,0xF7,0x18,0x45,0x99,0xCB,0xA2,0xFF,0x00,0xAF,0x65,0xD2,0x3C,0xB7,0x2D,0xD0,0x0C,0x74,0xD0,0x95,0x3B,
0x82,0xAA,0x2D,0x88,0xBE,0x46,0x93,0x5E,0xA1,0x02,0x0F,0x65,0x03,0x19,0xF5,0x1E,0x71,0x98,0x64,0xAE,0xB0,0xAC,0xAC,0xE8,0x5A,0xDA,0x5B,0x7D,0xB1,0x7B,0xCB,0xB3,
0x4A,0x6C,0xC6,0x8C,0x4F,0x0B,0x82,0x41,0xB3,0x28,0xEA,0xA7,0x16,0x52,0x4F,0x82,0x52,0x83,0xC6,0xCE,0x35,0x1D,0x31,0x8D,0x64,0xD0,0x81,0x8D,0xC5,0x80,0xB7,0x4B,
0x7F,0x9C,0x0D,0xC9,0x8B,0xFD,0x03,0x06,0x49,0x24,0x4A,0xE5,0x55,0xAF,0x6C,0x08,0xD2,0x2A,0xB1,0x56,0x36,0xB6,0x18,0x90,0x2B,0x41,0x1A,0x9B,0x14,0x5C,0x0E,0xF4,
0xD1,0x2E,0xE1,0x05,0xB0,0x4B,0xCA,0xBA,0xFC,0x64,0x0C,0x40,0xEC,0x19,0xEE,0x31,0xCE,0xE6,0xD8,0x01,0xCB,0x0C,0x5C,0xCF,0xC8,0x3A,0x61,0x4E,0x69,0x55,0x0D,0x13,
0x47,0x1A,0x21,0x92,0xA2,0x53,0xA6,0x28,0x10,0xEE,0xC7,0xCF,0xD0,0x79,0x9C,0x45,0xC5,0x9C,0x53,0x45,0xC3,0x79,0x6F,0xCC,0xC9,0xF8,0xD3,0xBF,0x86,0x18,0x14,0xEE,
0xE7,0xFC,0x0B,0x8B,0x9C,0x22,0xF8,0x59,0x3E,0x65,0x9C,0xF1,0x15,0x7E,0x73,0x9A,0x48,0xF2,0xAA,0x26,0xC4,0xC6,0x36,0x37,0x1B,0x2F,0xA0,0xDA,0xD8,0xCB,0xD5,0x16,
0x82,0xB8,0xD1,0x63,0xA8,0xA1,0x92,0x91,0xA2,0xA7,0xA8,0xD0,0xD5,0x06,0x21,0x24,0x96,0x16,0x00,0x92,0x76,0x18,0x11,0xA0,0x8D,0x4D,0x8A,0x2E,0x0F,0xCD,0x26,0x41,
0xC4,0x05,0x1E,0x6D,0x72,0xB4,0x60,0x15,0xF2,0x23,0xB0,0x1F,0x5C,0x41,0x2B,0x0B,0x69,0xEF,0x8C,0x28,0x2E,0x9E,0x08,0x99,0xAC,0x50,0x60,0x39,0x69,0x20,0xE6,0x7E,
0x4E,0xD8,0x3D,0xD8,0x33,0xDC,0x60,0x69,0x7F,0xA9,0xF4,0xC0,0x02,0x59,0xB2,0x7A,0x03,0xA8,0x9A,0x38,0x4B,0x11,0x72,0x4A,0x83,0x85,0x15,0x7C,0x23,0xC3,0xF5,0x12,
0x6B,0x9B,0x29,0xA5,0x79,0x3B,0xB1,0x41,0x8B,0x2B,0x31,0x63,0x73,0x85,0xF2,0xB0,0xB6,0x9E,0xF8,0x00,0xF4,0x36,0x5F,0x50,0xE8,0x81,0xCA,0x24,0xC1,0x01,0xB9,0x09,
0x73,0xD3,0xC8,0x62,0x6A,0x99,0xE3,0xA9,0xA5,0x13,0x72,0x82,0xB2,0xEE,0xB2,0x46,0x01,0x23,0xCF,0x63,0x88,0xEB,0x32,0xFA,0x2C,0xB2,0x49,0x2A,0x29,0x2B,0x4C,0x2D,
0xD6,0xCC,0xB7,0x1F,0x7C,0x05,0xCD,0x8F,0x30,0xA4,0x47,0xA9,0x9A,0x0D,0x40,0x9B,0x33,0x0D,0x21,0x87,0x90,0x7D,0x8F,0xDF,0x1C,0xB0,0x9F,0x68,0xD7,0x5D,0x1E,0x3C,
0xFE,0x26,0x32,0x6C,0xBE,0x87,0xE2,0x1A,0xE7,0x70,0x42,0xA1,0x2B,0x51,0x4B,0xE8,0x16,0xFC,0x40,0x2C,0xC7,0x6E,0xFD,0x0F,0xD7,0x1E,0xC3,0xF8,0x67,0x49,0x47,0x55,
0xF0,0x67,0x85,0xEA,0x50,0x16,0x07,0x29,0xA6,0x37,0x3D,0x7F,0xA4,0xB8,0xCD,0x7E,0x32,0x7C,0x3E,0x4E,0x32,0xE0,0x99,0x69,0x21,0x51,0x35,0x65,0x10,0x35,0x11,0x0D,
0x0A,0x5A,0x4D,0xBA,0x29,0xEF,0xF4,0xC3,0x1F,0xE1,0xE3,0x8D,0xA9,0x33,0x4F,0x84,0x34,0x99,0x24,0x8A,0x20,0xAE,0xC9,0x89,0xA2,0x95,0x19,0x89,0xB8,0x04,0x95,0x6D,
0xF7,0xE8,0x6D,0xEE,0x0E,0x1F,0x1F,0x3B,0x0A,0xD5,0x9A,0x7D,0x7C,0x54,0xD0,0x07,0x76,0x08,0x58,0x6F,0xBF,0x6C,0x57,0x04,0x30,0x55,0x54,0x30,0x75,0x32,0xB1,0xD8,
0xFA,0x60,0xAC,0xFA,0xAE,0x46,0x52,0xE5,0xC3,0x17,0xD8,0x79,0x5B,0x1D,0xF2,0x5A,0x46,0x8A,0x01,0xA1,0x35,0x4C,0xFD,0x5F,0xC8,0xE2,0xD7,0xBA,0x2D,0x8F,0x81,0x36,
0x77,0xC1,0xCB,0x2D,0x01,0x9E,0xC1,0x5C,0x02,0x42,0x8E,0x87,0x19,0xA6,0x65,0x5B,0x9D,0xF0,0xFC,0xEF,0x36,0x59,0xF8,0x73,0xAB,0x04,0x92,0x19,0x45,0xD5,0x81,0x36,
0x1D,0x7A,0x78,0xAD,0xBF,0xFB,0xB1,0xBF,0x56,0x1C,0xBA,0x92,0x91,0x4D,0x6A,0x33,0xB3,0x75,0x20,0xFF,0x00,0x9C,0x65,0x1C,0x65,0x43,0x1D,0x59,0x9A,0x4A,0x37,0x2C,
0x18,0x00,0x88,0xBD,0x19,0xAE,0x0F,0x43,0xDC,0x5B,0x1A,0x4E,0xDC,0xB4,0x63,0x75,0xBF,0xC4,0x26,0x6F,0x4F,0x9A,0xCB,0x97,0x55,0xE4,0x4D,0x4D,0x57,0x16,0xA2,0xCA,
0x58,0xD8,0x15,0x62,0xA7,0xF6,0x38,0xEB,0x0F,0xF1,0x1B,0xF3,0x4E,0xF0,0xAE,0x49,0x31,0x91,0x53,0x58,0x41,0x70,0x5E,0xC3,0xC5,0x6B,0xDB,0xDC,0x7D,0xB1,0x75,0xF8,
0x83,0xC0,0x39,0x35,0x45,0x74,0x99,0xC5,0x14,0x5F,0x89,0x14,0x12,0x3C,0xAC,0x77,0x2F,0xE1,0xF0,0x83,0xE9,0xB0,0x1F,0x53,0x8C,0x2D,0x32,0xD6,0xCB,0x6A,0x09,0x9E,
0x9D,0x5E,0x04,0x45,0x95,0x4B,0x2E,0xEC,0x0D,0xC3,0x0B,0xFD,0x09,0xFA,0x0C,0x43,0x27,0xE4,0x6C,0x4C,0x78,0xD5,0x9A,0x2A,0x7C,0x7C,0x35,0x21,0xA3,0xFE,0x4B,0x56,
0x25,0x54,0x2D,0xA5,0x86,0xFA,0x86,0xC4,0x7B,0xDA,0xC4,0x7A,0xE1,0xB8,0xF8,0xA6,0x2B,0x3E,0x4E,0x3D,0x33,0xC4,0x92,0xA2,0x16,0x3B,0x5F,0x73,0x72,0x3A,0xEC,0x40,
0x07,0x19,0x64,0x75,0x14,0x79,0x65,0x6D,0x0C,0xF3,0x13,0xCF,0x99,0x96,0x49,0x13,0x4D,0xED,0xE2,0xD3,0x60,0x7D,0x40,0xFB,0xE2,0xC0,0xB1,0xD0,0xFC,0x85,0x43,0x23,
0x46,0xAB,0x0C,0x9A,0x5C,0x1D,0xB4,0x5F,0x50,0xF0,0xFD,0xEF,0x85,0x8E,0x7F,0x20,0x78,0xD4,0x5E,0x8B,0x4E,0x69,0x92,0xD5,0x67,0x39,0xE4,0x19,0xAC,0xF5,0x32,0xCA,
0x8C,0x0A,0xC7,0x16,0x92,0x79,0x6A,0x2F,0xB7,0xED,0xFA,0xE2,0xED,0xC1,0x6D,0xFC,0xAF,0x2F,0x68,0x0A,0xD9,0xEA,0x49,0x63,0xA6,0xF7,0xD9,0x85,0xEC,0x3E,0xA0,0xE0,
0x0E,0x06,0xE2,0x6C,0xA3,0x36,0xCC,0xA3,0xA1,0x58,0x16,0x6F,0x12,0x84,0x88,0x36,0x93,0x60,0xAC,0x4F,0xBE,0xEA,0x6F,0xEF,0x8B,0x8E,0x65,0x05,0x2D,0x5E,0x68,0x33,
0x3C,0xBA,0x45,0x02,0x10,0x62,0x90,0x2A,0xDB,0xC7,0xE1,0xBF,0xEA,0x3E,0xC3,0x17,0x83,0xB5,0xB3,0x6F,0x54,0x29,0xCF,0xF9,0x31,0xD6,0xAE,0x61,0x10,0x70,0xE2,0x40,
0x0B,0xD8,0x9F,0x05,0xB7,0xFF,0x00,0xDE,0x3A,0xF3,0xD2,0x58,0x96,0x60,0xC1,0x94,0x8E,0xAB,0xB8,0xC3,0x7C,0xF5,0x29,0xD7,0x26,0xF9,0xAA,0x52,0xB2,0x8D,0x1A,0xE4,
0x42,0x7C,0x24,0xE9,0xF1,0x0F,0xDF,0x15,0x6C,0xB2,0x90,0xD2,0x65,0x08,0x35,0x12,0x1B,0xF1,0x2C,0x7F,0xB6,0xFB,0xD8,0x61,0x8C,0x08,0x9A,0x53,0x76,0x1F,0xDC,0x36,
0xC0,0xAE,0xC5,0x56,0xE3,0xCF,0x1D,0xDD,0x99,0xDA,0xE5,0xB6,0x1D,0x06,0x06,0x76,0x0C,0xD7,0x18,0x0C,0x6A,0xC8,0xA7,0x93,0x51,0x2A,0x46,0xE0,0xF5,0xC0,0xB2,0xFF,
0x00,0x4F,0xEB,0x89,0xA4,0x7D,0x56,0x03,0xA1,0xC0,0x8E,0xC1,0x9A,0xE3,0x18,0xEF,0xA0,0x77,0xD1,0xBE,0x66,0x35,0x55,0xB5,0x3A,0x9E,0x0A,0x6D,0x2A,0x0E,0xDA,0xD8,
0x23,0x7B,0xF5,0xC4,0x55,0x10,0x4B,0x4F,0x43,0xCA,0x04,0x3B,0x3E,0xE6,0x2D,0x5A,0x3F,0x4D,0xC3,0x7D,0xB0,0xCD,0xE5,0x14,0x5C,0xA2,0x94,0x4D,0x25,0xBA,0xB1,0x2A,
0x00,0xF4,0xF3,0xC0,0x55,0xF2,0xA9,0x03,0x9D,0x96,0x4A,0x8B,0x21,0xB0,0x65,0x7B,0x0F,0xB7,0xF9,0xC7,0x94,0x75,0x82,0x64,0x74,0x51,0xC7,0x3B,0xA2,0xE9,0x8B,0x59,
0x37,0x49,0x08,0x2B,0x7F,0x20,0xBE,0x5E,0xD8,0xA9,0x66,0x3C,0x3B,0x47,0xC0,0x9F,0x15,0xA2,0xE2,0x8A,0x18,0xB9,0x39,0x4E,0x6F,0xF8,0x39,0x8C,0x51,0xAF,0x86,0x19,
0x3A,0xA4,0x96,0xDF,0x6D,0x5D,0x4F,0xA9,0xC6,0x93,0x95,0xE5,0xCA,0xD0,0x7C,0xCA,0xC2,0x0C,0x7D,0x46,0xB3,0xAC,0xAF,0xD3,0x0C,0x2B,0xE8,0x56,0x7A,0x27,0x35,0x10,
0x89,0x14,0xAE,0xEA,0x46,0xA5,0x23,0xD4,0x77,0xC5,0x7C,0xE5,0xFD,0x0A,0xE6,0x96,0x8A,0x26,0x75,0x5D,0x04,0x87,0x95,0x0B,0x6A,0x8D,0x0D,0xF5,0x03,0xFE,0x31,0x65,
0xE1,0x49,0x61,0x6C,0xAC,0x19,0xE4,0x1A,0xBD,0x70,0x83,0x32,0xC8,0x53,0x27,0xAD,0x67,0x48,0x1D,0xB2,0xF9,0x53,0x5C,0x52,0x2E,0xEB,0x1B,0x77,0x4F,0x31,0xE9,0x8E,
0xBC,0x3D,0x53,0x1C,0xB5,0x75,0x10,0xCA,0x5B,0x42,0x0D,0xB4,0xEC,0x17,0xD4,0xE3,0xB2,0x16,0xDD,0x98,0x92,0x6A,0x91,0x66,0xE2,0x41,0x0C,0xB9,0x74,0xA6,0x33,0x76,
0xEA,0x18,0x6F,0x6D,0xB1,0x96,0x66,0xD5,0x13,0xD6,0xE5,0xD4,0xF4,0xF4,0x09,0x6A,0xA5,0x71,0x0C,0xB1,0xDE,0xE1,0xD1,0xB7,0xD4,0x3D,0x41,0x43,0xF4,0xC5,0xC7,0x8B,
0x4C,0xD0,0x65,0x6B,0x55,0x4B,0x32,0x08,0xE6,0x65,0x89,0x64,0x2F,0xB5,0xC9,0xB0,0xDA,0xDE,0xBD,0x70,0x3D,0x16,0x47,0x4B,0x03,0xC7,0x2C,0xAC,0xC5,0x96,0xCF,0x1B,
0x92,0x7A,0x9E,0xB7,0xFB,0x91,0x89,0x64,0x9D,0xBA,0x89,0xBA,0x8A,0x14,0xD6,0x52,0x5B,0x84,0xDF,0x99,0x09,0x25,0xD5,0xA1,0x57,0x6F,0xCC,0x6C,0xDB,0x13,0xF4,0x1F,
0xAE,0x30,0xFE,0x29,0xA3,0xA6,0xA7,0x8D,0xB2,0xA8,0x60,0x2F,0xAC,0xB4,0x6A,0xF1,0x81,0xF8,0x46,0xFE,0x11,0xD3,0xFD,0xC4,0x63,0xD0,0x19,0xC0,0xAB,0xA9,0xAA,0x9E,
0x38,0xD9,0x63,0xA0,0x44,0x11,0x4C,0xC1,0x6F,0xC9,0x7B,0xDC,0x1F,0xD7,0xAF,0x98,0x18,0xA9,0x45,0xC2,0x0F,0x2E,0x65,0x34,0x55,0x50,0xA9,0x59,0xE2,0x05,0x25,0x53,
0x72,0xEE,0x84,0x91,0xF5,0xB5,0xB7,0xEF,0x71,0x8C,0x94,0x53,0xD3,0x23,0x07,0x4F,0x66,0x03,0x99,0xE5,0x70,0xD0,0xE4,0x51,0xAD,0x5A,0xF3,0x2B,0x29,0x69,0xD2,0x37,
0x41,0xDD,0xB5,0xDC,0x11,0xEA,0x14,0xDF,0xDC,0x60,0x4C,0xDA,0x82,0x9A,0x1C,0xB0,0xE7,0x10,0x57,0x12,0xD2,0x40,0xD3,0x3C,0x57,0xFF,0x00,0x68,0xD3,0xF7,0x04,0x7D,
0xF1,0xA8,0x71,0x47,0x0B,0x1F,0x94,0xAB,0xA8,0x11,0x82,0xC0,0xCF,0x7B,0xDC,0xB1,0x01,0x14,0x10,0x3B,0x6D,0x73,0xFA,0x63,0x31,0xCC,0xB8,0x5E,0x5A,0x5B,0x72,0xE6,
0x60,0xAA,0x51,0x80,0x63,0x70,0xC8,0x5A,0xCD,0x7F,0x40,0x05,0xF6,0xC2,0x7A,0x90,0xD7,0x72,0xD0,0x07,0xC3,0xCE,0x26,0x97,0x2A,0xE2,0xEA,0x1A,0xC9,0x98,0x88,0x63,
0x9C,0xC6,0xEA,0xA3,0x49,0x11,0xDC,0xB3,0x9F,0xB1,0x3F,0x7C,0x7A,0x43,0x28,0xAB,0x9A,0xA7,0x27,0x4F,0x97,0x78,0xE2,0x89,0x97,0xE6,0x27,0x91,0x89,0x66,0xD6,0xC4,
0xED,0x61,0xE8,0x3A,0x63,0x0E,0xCB,0xF8,0x52,0x92,0xB7,0x26,0x86,0xBE,0x14,0x92,0x19,0x65,0x56,0x46,0xDA,0xEA,0xAC,0xA1,0x77,0xB7,0x6B,0xDF,0xFE,0x71,0x60,0xE1,
0x1C,0xE2,0xAF,0x2D,0x57,0xC9,0xEB,0x25,0xE6,0x4F,0x15,0x4B,0x69,0x7B,0x0D,0x3C,0xA2,0x00,0x02,0xF7,0xDC,0x8D,0xC7,0xD3,0x14,0x26,0x6A,0x95,0xAB,0x3B,0xE5,0x53,
0x53,0x99,0xDC,0x29,0x5E,0x61,0x05,0x74,0xEE,0xC6,0xE0,0x7D,0xF7,0xC0,0x25,0xC0,0x8A,0x38,0x94,0x12,0x15,0x40,0x2C,0x7B,0xDB,0x1C,0x69,0x11,0xE3,0xB4,0x3A,0xF9,
0x6E,0x06,0xEC,0x6E,0x4F,0xAE,0x21,0x79,0x02,0x80,0x01,0x1A,0xBB,0x8C,0x75,0x18,0xD5,0x9C,0xA9,0x7B,0xCB,0xA5,0x7A,0x0E,0xB8,0x12,0x59,0x44,0x63,0xD7,0x12,0xC9,
0x11,0x2A,0x35,0x74,0x1E,0x58,0x0A,0x70,0x55,0x2C,0xC4,0x03,0xDB,0x00,0x6E,0xCE,0x34,0xEA,0xC6,0xE7,0xF6,0xC0,0x72,0xB2,0xDB,0x48,0x60,0x4F,0xA6,0x24,0x55,0x7E,
0x58,0x76,0x16,0xBF,0x4C,0x40,0xE9,0xA7,0x71,0xD3,0x09,0x36,0xB8,0x66,0x9E,0x96,0xCC,0xA9,0x20,0x50,0x19,0xCC,0x71,0xE9,0x17,0xD4,0xC5,0xB4,0xDF,0xDA,0xF8,0x12,
0x6A,0xC8,0x92,0x8B,0x97,0x33,0x5A,0x39,0x3C,0x37,0x8D,0x43,0x5E,0xFE,0x87,0x06,0x67,0xB1,0x7C,0xC4,0xD4,0xF1,0x84,0xD0,0x41,0x27,0x5B,0x90,0x74,0xFD,0x2F,0x84,
0xB5,0x79,0x41,0x68,0xFF,0x00,0x02,0xA5,0xE7,0xA8,0xB6,0xAD,0x52,0x48,0x42,0xA7,0xB0,0xED,0x8F,0x2E,0xF7,0x47,0x50,0xFF,0x00,0x87,0x79,0xEB,0x01,0x50,0x96,0x8F,
0xB1,0x7E,0xA7,0xF4,0xC1,0xF5,0xCB,0x2C,0xF1,0x78,0x26,0x9A,0x9C,0x9D,0x98,0x0F,0x5F,0x7C,0x20,0xCA,0x6B,0xFE,0x56,0xB5,0x61,0x9A,0xAD,0xE4,0x20,0x6E,0x11,0x18,
0xDB,0xEB,0xBE,0x1A,0xD7,0xE6,0x17,0x48,0xC8,0x76,0xB3,0x11,0x7B,0xA8,0xDC,0x7D,0x71,0xD5,0x85,0xD2,0x21,0x93,0x92,0x0A,0x8E,0x1E,0xCE,0x9E,0x0F,0x96,0x15,0x74,
0x55,0x31,0x01,0xB3,0x4E,0xAE,0xAC,0x7D,0xEC,0x6D,0xFA,0x61,0x74,0x1C,0x39,0x57,0x96,0xD4,0x55,0xC5,0x23,0xC2,0xCB,0x56,0x8A,0xA8,0xAB,0xD1,0x2C,0xB6,0x3E,0x5D,
0xF7,0xC5,0x91,0xF3,0x65,0x48,0x06,0x88,0x9D,0x89,0xDF,0x63,0x6F,0xDF,0x15,0x3E,0x20,0xCD,0xB3,0x00,0x5A,0x5E,0x6D,0x3A,0x12,0x6D,0x1A,0xF3,0x40,0x3E,0xD8,0xB2,
0x9D,0x21,0x09,0x66,0x9A,0x90,0x81,0x97,0x3C,0x49,0x24,0xC9,0x74,0x61,0xB5,0xAF,0xEA,0x3B,0xE2,0x37,0xA0,0x0B,0x44,0x94,0x70,0xA1,0x2C,0x1B,0x71,0x19,0x20,0x2D,
0xFC,0xAE,0x7C,0xF1,0x5C,0x85,0x5D,0xEA,0x35,0xDE,0x78,0xDE,0x57,0xBB,0x19,0xAE,0x00,0x3E,0x63,0xD3,0x0D,0x93,0x30,0x87,0x20,0xAB,0x59,0xAB,0xA5,0x92,0x71,0x3B,
0x00,0x14,0x38,0xBA,0x93,0xE4,0xDD,0x2D,0xE8,0x6D,0x84,0x35,0xBB,0x33,0xAF,0x8D,0x1F,0x17,0x72,0xCF,0x86,0x19,0x71,0xA7,0xA6,0x8A,0x1A,0xCC,0xE6,0x45,0x59,0x19,
0x25,0xB0,0x10,0x9D,0xB6,0x20,0x1F,0x11,0xB7,0x6C,0x65,0x7F,0x0E,0x7F,0x88,0x8C,0xC7,0x8B,0x38,0xB6,0x9B,0x21,0xCC,0xA9,0x29,0xB2,0xE9,0xE7,0x2E,0x90,0x54,0xC3,
0xF9,0x75,0x15,0x36,0x52,0xA7,0xBF,0x50,0x3E,0x98,0xCA,0xBF,0x88,0x5A,0xB9,0x73,0x0F,0x8E,0xB5,0xB5,0x75,0xF1,0x4C,0xB1,0xAD,0x5B,0xE9,0x57,0x36,0xD4,0x9A,0x86,
0x9F,0xD3,0x1A,0x27,0x0F,0x7C,0x3B,0xE1,0xEE,0x22,0x9E,0x2F,0x88,0xFC,0x23,0x40,0xD9,0x42,0x41,0x99,0x51,0xC5,0x4F,0x93,0xCC,0x4B,0x3B,0x84,0x50,0x65,0x97,0x51,
0xFE,0xD2,0x45,0xF6,0xB8,0xDC,0x8B,0xE3,0xA6,0x2A,0x91,0x87,0xA1,0xB3,0x3A,0x58,0x17,0x28,0x86,0x24,0x85,0xA7,0xD5,0x19,0x46,0x04,0xF9,0xA5,0x9C,0x93,0xEB,0xFF,
0x00,0x18,0xCF,0x38,0x8F,0x84,0x05,0x3A,0xB2,0x56,0xA3,0x37,0x2A,0xF0,0x2A,0xAD,0xFC,0x31,0xEE,0x2C,0x4F,0xA5,0xBA,0xE2,0xFD,0x59,0x58,0x29,0x16,0x3D,0x48,0x35,
0xCD,0x20,0x57,0xE6,0x0B,0x69,0xDF,0x62,0x0F,0x99,0x16,0xC1,0x0F,0x24,0x39,0xDD,0x5D,0x4C,0x33,0x05,0xE6,0x68,0x0B,0xBF,0x52,0xE4,0xFF,0x00,0x82,0x70,0xAF,0xE4,
0xB4,0x6A,0x74,0x64,0x3C,0x3F,0x56,0xE9,0x4F,0x15,0x37,0x2A,0x34,0x49,0x23,0xE6,0xA0,0xD8,0x0F,0x10,0x0A,0x6F,0x7E,0xD7,0xBF,0xDC,0x63,0x1B,0xCE,0xF8,0xD6,0x9F,
0x25,0xF8,0xB8,0xFC,0x3B,0x99,0xB1,0x89,0x20,0x64,0x8A,0x09,0xC1,0x01,0x0E,0xB5,0x56,0xF1,0x9E,0xBD,0x4F,0x5D,0xF1,0xE8,0x57,0xC9,0x10,0xD7,0xCB,0x24,0x69,0x64,
0x85,0xCA,0x24,0x2C,0x9A,0x40,0xD4,0xEA,0x16,0xD7,0xED,0x72,0x7E,0xB8,0xF3,0x67,0xC6,0xAE,0x05,0x9A,0xAF,0xE2,0x0E,0x53,0x55,0x4D,0x4E,0x0C,0x2F,0x12,0xA5,0x4C,
0x8A,0x46,0xFA,0x58,0x90,0x4F,0xFF,0x00,0x12,0x07,0xA5,0xB1,0x8A,0x1A,0xA6,0x61,0xE8,0xFC,0xB9,0x9E,0x5A,0x38,0xE7,0x9A,0x4D,0x6C,0x40,0xFC,0xBD,0x3A,0x6C,0x06,
0x19,0x94,0x28,0x6C,0x48,0x24,0x8D,0xF1,0x5C,0xE1,0x69,0x0D,0x4E,0x47,0x05,0x41,0xA9,0x25,0x51,0x79,0x60,0x29,0xEE,0x36,0xB9,0xEF,0xD3,0x0D,0x9E,0xB2,0x39,0x91,
0xB9,0x12,0x8D,0x20,0xD9,0x9F,0xF7,0xB6,0x28,0x04,0xB5,0x33,0x05,0xBC,0x69,0xE3,0x7B,0xF4,0x07,0xA7,0xBE,0x00,0x92,0x22,0xF3,0x97,0x9C,0xEB,0x7E,0x9B,0x1D,0x86,
0x3A,0x4B,0x3C,0x68,0x49,0x4B,0x2C,0x60,0x7E,0x66,0x6B,0xFD,0xF0,0x0C,0xD9,0x94,0x3C,0xD2,0xBC,0xCD,0x4C,0x3B,0xF6,0xC0,0x01,0xB2,0x3A,0xB2,0x58,0x60,0x39,0x18,
0x34,0x84,0x8E,0x9D,0xB1,0xF1,0xA7,0x0E,0x97,0x2C,0xAA,0x2F,0xEF,0x88,0x65,0xD2,0x1B,0x79,0x35,0x1F,0x3E,0xD8,0x84,0xDB,0xE1,0x81,0xE9,0xFC,0xD6,0x2A,0x63,0x5A,
0xCB,0x20,0xD6,0x41,0xBE,0x90,0x6D,0x6F,0xB6,0x12,0x66,0xC6,0xAA,0x2B,0x06,0x95,0x29,0xE3,0x6E,0xA9,0x1C,0x65,0xDB,0xEA,0x4D,0xED,0x8B,0x6C,0xB4,0xF0,0xA3,0x4B,
0x2E,0x98,0xCB,0xF4,0x2C,0x45,0xDA,0xDF,0xAE,0x2B,0x35,0xD4,0xF5,0x55,0x55,0x84,0x3C,0xBA,0xD7,0xB4,0x43,0xC2,0x00,0xFD,0xCF,0xB9,0xC7,0x9D,0x5F,0x2B,0x3A,0x85,
0xF9,0x32,0xE6,0x26,0x53,0x2F,0xF3,0x39,0x8A,0xDE,0xC2,0x24,0x83,0x55,0xBD,0xFB,0x0C,0x77,0xCC,0xE9,0xB3,0x29,0xEA,0x23,0x98,0x66,0x93,0x23,0x46,0x40,0x29,0x50,
0x42,0xDF,0x7F,0x2E,0xDD,0x70,0x6E,0x5B,0x44,0xB4,0x92,0xEA,0x69,0x0B,0x6F,0xF9,0x75,0x78,0x40,0xF3,0xDC,0xE0,0xBA,0xF9,0xD1,0x23,0x3A,0x62,0x66,0x24,0x58,0x00,
0x7F,0xF7,0x8B,0x62,0xE4,0x4C,0x9C,0x04,0xC6,0xF9,0x92,0x65,0x8A,0x86,0xAA,0x29,0x64,0x23,0xF2,0x93,0x75,0xFA,0x77,0xC5,0x37,0x35,0xCF,0xAB,0xE8,0x39,0xE2,0xB7,
0x24,0x13,0x8B,0xF8,0x5A,0x21,0x72,0x77,0xEC,0xB6,0xC5,0x89,0x26,0x5A,0x58,0x62,0x67,0x82,0x58,0xD9,0x85,0xC5,0xD9,0x74,0xB7,0xDC,0xDF,0x0B,0xB3,0x29,0x11,0xE1,
0x96,0xA4,0x47,0x0C,0x41,0x96,0xC4,0xB3,0x81,0xA8,0x7D,0xF1,0xD2,0xDD,0x90,0x10,0xFF,0x00,0xD4,0xA9,0x51,0x96,0xBB,0x4B,0x46,0x69,0xC2,0x25,0xD5,0x24,0x42,0xB6,
0xC2,0xFC,0xB5,0x2A,0x2A,0x5C,0x66,0x55,0x0A,0xB2,0x95,0x3E,0x0E,0x54,0xBE,0x18,0xFA,0xEF,0xA4,0x92,0x3A,0x1F,0x4C,0x7D,0xAB,0xCC,0xE0,0xE5,0x07,0x9B,0x25,0x57,
0x8D,0x4D,0x96,0x56,0x2A,0x2F,0xEA,0x0D,0xF1,0x0B,0xC8,0x15,0x05,0x4C,0xA6,0x68,0x65,0x2D,0x65,0x57,0xA9,0xD5,0x1B,0x7A,0x5E,0xE5,0xB0,0xB2,0x8D,0xE8,0x65,0x6B,
0x67,0x4C,0xFB,0x82,0x72,0xCE,0x27,0x9B,0x9F,0x53,0x95,0xE5,0xEB,0x58,0xDB,0xBC,0xD3,0x21,0x91,0x0A,0x5B,0xCA,0xC2,0xC7,0x07,0x45,0x1D,0x16,0x55,0x41,0xFC,0xAA,
0x38,0xBE,0x42,0x64,0x50,0xE2,0x61,0xE2,0x49,0xB4,0xDF,0xD2,0xC3,0xED,0xE5,0x89,0x20,0x7C,0xC9,0xE0,0x57,0xAA,0x58,0x4C,0x1A,0xBF,0xF1,0x31,0x72,0x41,0xF3,0x24,
0x5C,0xFE,0xB8,0x1F,0x3C,0xAF,0xA7,0xA3,0xC9,0x24,0xF9,0xAA,0x1A,0x8A,0xDA,0x52,0xA4,0x37,0x2F,0x4B,0x32,0x93,0xEF,0xDB,0xD4,0x6F,0x8A,0xE3,0x5D,0x98,0xD5,0x72,
0x03,0xC4,0x4E,0xE6,0x92,0x96,0x8D,0x67,0x15,0x06,0xAA,0x30,0xCD,0x2A,0x1B,0x84,0x20,0xEA,0x17,0x03,0xD4,0x7E,0xA7,0x10,0xE5,0x19,0xD0,0x8A,0x54,0xAB,0xAE,0xA6,
0xE4,0x43,0x19,0x40,0x00,0x37,0x77,0x00,0x90,0x48,0xF6,0xB6,0x2B,0xD4,0x39,0x57,0x31,0x20,0xAC,0xCB,0xE5,0x9A,0xA2,0x12,0x54,0x82,0xED,0xAA,0x48,0xC0,0xD8,0x86,
0x3B,0x5F,0x6B,0x58,0xFA,0x77,0xC3,0xCF,0xE5,0xE5,0x53,0x4C,0xE4,0x48,0xB7,0x36,0x94,0xAE,0xEA,0x3A,0xFF,0x00,0xFB,0x8A,0xD6,0xEC,0xD5,0x06,0xCE,0xD9,0xE5,0x4C,
0x74,0x1C,0x8C,0xEA,0x34,0x32,0x34,0x87,0x98,0xF0,0x90,0x00,0x74,0xBA,0x28,0x5F,0x70,0x6C,0x41,0xF4,0xC6,0x47,0xC7,0x39,0xA5,0x3E,0x65,0x41,0x9A,0x31,0xA2,0xE5,
0xC2,0x8A,0x64,0x86,0x4B,0x58,0xDD,0xC9,0xB9,0x3D,0x2C,0x00,0x16,0xB7,0xA8,0xC5,0xC3,0x88,0xEA,0x9E,0xAE,0x9D,0xE9,0x91,0x4B,0x98,0x86,0x94,0x70,0x4F,0x84,0x03,
0xB7,0xD6,0xF6,0xDB,0x00,0x0C,0xA6,0x3C,0xDB,0x85,0x6A,0x72,0xDA,0x70,0x08,0x93,0x4F,0x34,0x3E,0xED,0x7B,0x11,0xF5,0x16,0xBD,0x81,0xC6,0x2A,0x7B,0x40,0xE0,0xD1,
0x41,0xE1,0x6A,0xF9,0xD2,0x9D,0xE3,0xAB,0x9F,0x5D,0x21,0x3A,0x95,0xD9,0x74,0x93,0x7E,0xB6,0x23,0xFB,0x6F,0xE5,0x8B,0x22,0xF1,0x6D,0x1C,0x6E,0x29,0xE9,0xAC,0x54,
0x0E,0xBB,0xF8,0x7F,0xCE,0x33,0xBE,0x2D,0xE7,0x65,0xFC,0x59,0x16,0x5B,0x02,0x4D,0x1D,0x3D,0x24,0x62,0x23,0x1B,0x58,0x82,0xD6,0x1B,0xD8,0x77,0xF7,0xC4,0x50,0xD5,
0x4A,0xAB,0x66,0x70,0x96,0xED,0x7B,0x93,0xEF,0x86,0x14,0xD0,0x64,0xCF,0x01,0x66,0xE6,0x39,0x62,0x77,0x00,0xE1,0x44,0xB9,0xE3,0xF3,0x4E,0xC6,0xDD,0xB0,0x91,0x56,
0x46,0xB0,0x56,0x69,0x2E,0x2F,0xE1,0xBF,0xFC,0x63,0xAD,0x4C,0x52,0xC7,0x10,0x0D,0xB6,0xAE,0xF6,0xC0,0x05,0x98,0xE7,0xCC,0xB4,0x88,0x58,0xD8,0x61,0x7D,0x6F,0x16,
0x18,0xA9,0xCB,0x23,0x11,0x7D,0x86,0xF8,0x49,0x30,0x78,0xF2,0xC0,0xFA,0xAC,0xC7,0xB6,0x11,0xCD,0xAE,0x55,0x92,0x02,0xD7,0xBE,0xE0,0x9E,0xC7,0xBE,0x25,0x38,0x36,
0xC0,0xFD,0x28,0x97,0x5F,0x38,0x8F,0xED,0x2B,0xF9,0xAD,0xDF,0x0B,0x6A,0xBC,0x11,0x4B,0x15,0x19,0x1A,0xC0,0x21,0xE5,0xBD,0xC7,0x9E,0x1D,0x4F,0x0C,0x73,0xDA,0x4D,
0x82,0x76,0x4B,0xEE,0x70,0xA6,0xB7,0x91,0x0C,0x9A,0x52,0x3D,0x89,0xB9,0xBF,0xFC,0x63,0xCF,0x71,0x69,0xD3,0x2C,0xB2,0x7D,0x95,0x69,0xE9,0x2A,0x90,0x13,0xF3,0xAC,
0x0D,0xB5,0x36,0xDB,0x9F,0xF6,0x9C,0x4A,0x89,0xA6,0x99,0x5A,0xA1,0x99,0xD9,0x8E,0xA0,0x19,0xAE,0xD6,0xF6,0x1B,0xFD,0xF0,0xF1,0x12,0x3A,0xAD,0x5A,0x84,0x42,0xDD,
0xD4,0xDC,0x74,0xB5,0xB0,0x0C,0x32,0xAC,0x4E,0xC5,0xC8,0x2D,0x7B,0x97,0x3B,0x0D,0x87,0x9F,0x96,0x3A,0x21,0x1A,0x5B,0x07,0x28,0xB1,0x7C,0x9F,0xF6,0xF5,0x0A,0x6A,
0xA9,0xC1,0x88,0x6E,0xA4,0xA0,0x3B,0xF6,0xB9,0x3B,0xE2,0x63,0x4F,0x95,0xCD,0x2D,0xCC,0x43,0x4D,0xB7,0x58,0xF6,0x5F,0xB6,0x22,0xAD,0x26,0xBB,0x4C,0xDC,0xC4,0x64,
0x53,0x73,0xB6,0xC6,0xDD,0xFF,0x00,0x4C,0x47,0x15,0x40,0x91,0x04,0x46,0x55,0x72,0x6F,0xAB,0xB0,0x5C,0x32,0x69,0xED,0x13,0x71,0x6B,0x90,0x6A,0x88,0x60,0xE6,0xBC,
0x73,0xBA,0x53,0x53,0xA9,0xDB,0xC0,0x18,0x91,0xF5,0x07,0x0B,0xA5,0x9B,0x28,0xA1,0xAF,0x88,0x98,0xA6,0xA8,0x49,0x18,0x04,0x24,0x0B,0x13,0xED,0xD4,0xF4,0xC3,0xA6,
0xAA,0xA2,0x4B,0x00,0x8B,0x52,0xCD,0xB1,0xF0,0xDC,0x03,0xF5,0xC2,0xEA,0xA4,0x9E,0x35,0xE6,0x5F,0x94,0x4F,0x78,0xD4,0x0B,0x0F,0x7B,0x62,0x94,0x9F,0x02,0x96,0x3A,
0x1A,0xAC,0xBE,0xAE,0x36,0x32,0x51,0xB2,0xB5,0xB6,0x56,0x0B,0xFB,0x12,0x6D,0x8A,0x5F,0x1B,0x41,0x53,0x96,0x66,0x34,0xB9,0xDE,0x5B,0xA9,0x45,0xF9,0x6F,0x4E,0x84,
0xE9,0x75,0xEE,0x18,0x1D,0xB1,0xF2,0x96,0x8B,0x31,0xA7,0x9C,0x81,0x53,0x35,0x4C,0x6C,0x2E,0xAA,0x64,0xB1,0x5D,0xF7,0xF2,0xC4,0x35,0xF5,0x10,0x54,0x29,0xA4,0xAD,
0xA3,0x55,0x98,0x8D,0x3A,0x95,0xB5,0xB0,0xF6,0xDB,0x15,0x82,0xA5,0xB0,0x07,0xA6,0xA4,0xA4,0x9C,0x35,0x76,0x55,0x4C,0xF4,0xF0,0xB0,0x3C,0xC8,0x82,0xD9,0x45,0xCF,
0xF6,0xEC,0x3E,0xD8,0x9E,0x47,0x35,0x91,0xB5,0x25,0x2F,0x81,0x5E,0xCA,0xDA,0xFB,0x1F,0xA7,0x7C,0x73,0x2D,0x8A,0x9A,0x9A,0x54,0x82,0x47,0x92,0x35,0x40,0x03,0x2D,
0x3A,0xDF,0x7F,0x56,0x37,0xFB,0x01,0x87,0x07,0x86,0x24,0xA8,0x98,0x4D,0x0C,0xC4,0x03,0xE2,0x21,0x45,0x81,0x3B,0x6F,0x8D,0x77,0xD1,0x7C,0x2E,0x3C,0x48,0xA9,0x65,
0xDC,0x37,0x24,0xF4,0xF3,0xCE,0xE0,0x5D,0x58,0xC6,0xF7,0x1B,0x06,0xDE,0xDF,0x70,0x31,0xD3,0x27,0xC8,0xCE,0x57,0x9D,0xCE,0x2A,0x2C,0x91,0x3F,0x8D,0x8B,0x0B,0x5B,
0x4A,0xED,0xED,0xD7,0x17,0xAA,0xFC,0x96,0xB7,0xF0,0xA1,0x13,0x14,0x76,0xB0,0x3A,0x16,0xDA,0xED,0xD0,0x9F,0x5D,0xF1,0x58,0xE3,0x19,0xE1,0xE1,0xDC,0xBA,0xA2,0xB6,
0xB2,0xAE,0x29,0x6A,0x99,0x08,0x10,0x96,0xD3,0xCC,0xDA,0xC6,0xDE,0x76,0xC6,0x28,0x24,0x5B,0x34,0xE0,0xE3,0x56,0x79,0xF7,0x8F,0x32,0xEA,0x4A,0xAE,0x26,0xAC,0xAD,
0x8B,0x30,0xA4,0x97,0xC5,0xAA,0xCB,0x2E,0xAD,0x8F,0xB8,0xEC,0x71,0x43,0x99,0x9E,0x24,0xB0,0xB5,0x89,0xD8,0x83,0x7C,0x5B,0xDA,0xBD,0x9E,0xAA,0xAA,0x5A,0xC2,0x65,
0x0C,0x8C,0x46,0xAE,0xA3,0x7B,0x81,0xEB,0x8A,0xCD,0x7C,0x34,0xED,0x7D,0x00,0x46,0x42,0x8B,0x1F,0x71,0x7C,0x3B,0x76,0x71,0x1D,0x28,0x2A,0xDE,0x79,0xD4,0x73,0x08,
0xB1,0xE9,0x87,0xF4,0x39,0x85,0x88,0xA6,0xAB,0x84,0x4D,0x01,0xF3,0x1B,0x8F,0x63,0x84,0x79,0x64,0x5F,0x2B,0x3B,0x54,0x4D,0xA0,0x82,0x2C,0xB7,0xE8,0x70,0x49,0x96,
0xB1,0xE6,0x78,0xC2,0xDD,0x62,0x25,0x98,0xA8,0xE8,0x3C,0xFD,0xB1,0x80,0x32,0xCD,0x62,0x81,0x20,0x67,0xA6,0x94,0x10,0xA3,0xFA,0x67,0xAD,0xB0,0x86,0x9C,0xAF,0xCF,
0xA4,0x8E,0x40,0x1D,0x0E,0x0E,0x66,0x54,0x93,0x4C,0xAC,0x41,0x6D,0xD6,0xC2,0xFA,0xBD,0xB0,0x25,0x55,0x25,0x40,0x88,0xCD,0x4E,0xCB,0x23,0x7F,0xA3,0xB8,0xC0,0x07,
0xE8,0xB2,0xC8,0xA8,0x9E,0x19,0x8D,0xC8,0x37,0x24,0xF7,0xED,0x85,0xD5,0xD3,0xC5,0x55,0x30,0x8D,0xC1,0x5B,0x8F,0xCA,0x08,0x3F,0x5C,0x57,0x56,0xAE,0xA5,0xA1,0xB1,
0x99,0x88,0xBE,0x39,0x3C,0xB2,0x43,0x4B,0xCE,0x8D,0xAC,0xFB,0x1B,0xF5,0xFE,0xEB,0x63,0x8D,0x45,0x2D,0x00,0xEA,0xC9,0x4A,0xC0,0x23,0x85,0x53,0xDA,0xFD,0xBA,0x58,
0x63,0xBC,0xAD,0x4F,0x2C,0x3F,0x2E,0xFA,0x34,0x80,0x59,0xD4,0x7E,0xD8,0xAB,0x45,0x53,0x3C,0x92,0x21,0x79,0x19,0x88,0x7D,0xAF,0xEE,0x71,0xD3,0x32,0xA8,0x9D,0x21,
0x25,0x25,0x65,0x24,0x6E,0x41,0xB7,0x7C,0x52,0x0A,0xD8,0x0F,0x1E,0x11,0x2A,0x15,0x79,0x34,0xC2,0x17,0x7D,0x27,0xAF,0xA6,0x17,0x0A,0x1A,0x61,0xCC,0x85,0x26,0xD0,
0xA5,0x6E,0x58,0x01,0xA9,0x8F,0x90,0x38,0x55,0xF3,0xB5,0x5C,0x8F,0xEB,0xB7,0xE4,0xC7,0xC6,0x25,0x68,0xA9,0xE6,0x04,0x87,0x29,0xBB,0x61,0x3C,0x77,0x66,0xDE,0xA8,
0x32,0x48,0x45,0x39,0x91,0x69,0x8D,0x90,0x30,0x55,0x24,0x76,0x06,0xE7,0x03,0x55,0xB4,0x8E,0x9A,0x35,0xB0,0x50,0x77,0x8C,0x9E,0xBE,0x67,0x10,0xD4,0xBB,0xA4,0x57,
0x56,0x6E,0xA3,0xBD,0xFB,0xE0,0x79,0xDD,0x9D,0x81,0x66,0x24,0xB3,0x6F,0xEB,0x8A,0xC2,0x29,0xAB,0x30,0x9E,0x58,0xF5,0xD1,0x98,0x92,0x59,0x43,0xB7,0x64,0x6B,0x5C,
0xFB,0xE2,0xAD,0x98,0x65,0xF9,0xAC,0x39,0x80,0xA8,0x5A,0x89,0x23,0xBB,0x5D,0xFB,0x83,0xE9,0x7E,0xD7,0xC3,0xF8,0x27,0x95,0x46,0x81,0x21,0x0B,0xCB,0x26,0xD8,0x44,
0x95,0x13,0xD5,0xF3,0x63,0xA9,0x95,0x9D,0x4C,0xA1,0x48,0x26,0xDB,0x11,0xE9,0x8E,0x88,0x2B,0x74,0x2C,0x9D,0x2B,0x03,0x8B,0x89,0x6B,0x72,0xEC,0xEE,0x9E,0x19,0xD1,
0x54,0xC8,0x4F,0x31,0x95,0xAF,0xB0,0xD8,0x0B,0x1D,0x86,0xE7,0x76,0xEB,0x6C,0x5A,0xB2,0x8F,0x88,0x1C,0xDA,0x3D,0x4C,0xC2,0x15,0xD6,0xCA,0x14,0x8D,0xF6,0xB5,0xC0,
0x3D,0xF1,0x88,0xD4,0xD7,0x56,0x0E,0x20,0x96,0x4F,0x98,0x72,0xC9,0x50,0x55,0x6E,0x6F,0x60,0x51,0x81,0x1F,0x5B,0x0C,0x76,0xCA,0x2A,0x67,0x93,0x3A,0x91,0x5E,0x4B,
0x85,0x52,0x46,0xC3,0x63,0xAB,0x17,0x51,0x48,0x59,0xCD,0xA7,0x46,0x9F,0xC4,0xDF,0x14,0xF3,0x6A,0x03,0x34,0xD4,0xC8,0xB5,0x11,0x00,0xB6,0x00,0x5C,0xAF,0x51,0xEE,
0x31,0x93,0x71,0x47,0x16,0x55,0x71,0x31,0x77,0xCC,0x6A,0x57,0xE6,0x95,0x43,0x0D,0x1F,0xDB,0x71,0xFB,0xE1,0xC7,0x10,0xED,0x48,0x95,0x0B,0xE1,0x94,0x38,0xF1,0x2E,
0xDD,0x4A,0x83,0xD3,0xAE,0x29,0xD5,0x27,0xE6,0x83,0xD4,0x4E,0x15,0xE5,0xD6,0x46,0xAB,0x00,0x6D,0x73,0xE5,0x89,0x64,0x7D,0x0D,0x07,0x6A,0xCA,0x8C,0xF5,0x55,0x14,
0xEE,0x46,0xED,0x66,0xB8,0x0C,0x2F,0xDF,0x10,0x57,0x54,0xA5,0x4C,0xFC,0xD4,0x6F,0x0C,0xAC,0x5D,0x93,0xFD,0x3B,0xEE,0x31,0x62,0x6A,0x4A,0x7A,0x8A,0x8A,0x81,0x34,
0x41,0x82,0x53,0x4A,0xCB,0xB9,0x16,0x21,0x49,0x07,0x14,0xB4,0x45,0x5A,0xBB,0xA8,0xB7,0x80,0xE2,0x63,0x0F,0xE4,0x8D,0x1E,0xBE,0xE8,0xC1,0x63,0x30,0xC6,0xDA,0x6E,
0x36,0x62,0xA0,0x9F,0xD4,0xE1,0xFE,0x55,0x1C,0x2E,0xDF,0x3E,0xF4,0xEA,0x64,0x0A,0xCA,0xAA,0x3A,0x3B,0x11,0x6D,0xF1,0x50,0xAA,0x76,0x4C,0xC1,0x4A,0x9B,0x6C,0x3F,
0xFA,0x0C,0x59,0x32,0x09,0x1C,0xD0,0x50,0x5D,0xCF,0x8F,0x9F,0x23,0x6F,0xD5,0x95,0x45,0x8F,0xD3,0x14,0x84,0x13,0x40,0x11,0x9D,0x23,0xC9,0x47,0x1B,0xD3,0x46,0x87,
0x96,0x0A,0xDA,0x20,0x00,0x2C,0xB6,0x36,0x07,0xAD,0xB7,0xB6,0x2B,0xF9,0x14,0x95,0x34,0x39,0x84,0xD5,0x35,0xD0,0x13,0x1C,0x06,0xCE,0x87,0x61,0xE2,0x52,0x05,0xCF,
0x98,0xB8,0x38,0xF9,0xC3,0x95,0x13,0xD4,0x56,0x3C,0x33,0xCA,0xF2,0x20,0x46,0x60,0xAC,0x76,0x06,0xE7,0x7F,0xD3,0x0E,0x73,0xF5,0x55,0xCB,0xA1,0x89,0x54,0x04,0x96,
0xEC,0xE2,0xDF,0x98,0x80,0x37,0xC2,0xC9,0x53,0xA0,0x3F,0xFF,0xD9,};
#include <SPI.h>
#include <TFT_eSPI.h>
TFT_eSPI tft = TFT_eSPI();
#include <JPEGDecoder.h>
#include "esp_camera.h"
// CAMERA_MODEL_AI_THINKER 对应板子的摄像头设置参数
#define PWDN_GPIO_NUM 32
#define RESET_GPIO_NUM -1
#define XCLK_GPIO_NUM 0
#define SIOD_GPIO_NUM 26
#define SIOC_GPIO_NUM 27
#define Y9_GPIO_NUM 35
#define Y8_GPIO_NUM 34
#define Y7_GPIO_NUM 39
#define Y6_GPIO_NUM 36
#define Y5_GPIO_NUM 21
#define Y4_GPIO_NUM 19
#define Y3_GPIO_NUM 18
#define Y2_GPIO_NUM 5
#define VSYNC_GPIO_NUM 25
#define HREF_GPIO_NUM 23
#define PCLK_GPIO_NUM 22
camera_fb_t * fb = NULL; //照片指针
char frame_size_num1=0; //有关设置图片大小的 0-8 越大越大
char jpeg_quality_num1=10; //有关图片 质量 越小越好 10跟20好像肉眼差不多
//DMA有关的 缓冲区
uint16_t dmaBuffer1[16*8]; //乒乓缓冲区1
uint16_t dmaBuffer2[16*8]; //2
uint16_t* dmaBufferPtr = dmaBuffer1; //指向缓冲区
bool dmaBufferSel = 0; //选哪一个区
bool camera_init(char frame_size_num = 3 , char jpeg_quality_num = 12){ //图像大小 0-6 越大越大
//配置摄像头 参数
camera_config_t config;
config.ledc_channel = LEDC_CHANNEL_0;
config.ledc_timer = LEDC_TIMER_0;
config.pin_d0 = Y2_GPIO_NUM;
config.pin_d1 = Y3_GPIO_NUM;
config.pin_d2 = Y4_GPIO_NUM;
config.pin_d3 = Y5_GPIO_NUM;
config.pin_d4 = Y6_GPIO_NUM;
config.pin_d5 = Y7_GPIO_NUM;
config.pin_d6 = Y8_GPIO_NUM;
config.pin_d7 = Y9_GPIO_NUM;
config.pin_xclk = XCLK_GPIO_NUM;
config.pin_pclk = PCLK_GPIO_NUM;
config.pin_vsync = VSYNC_GPIO_NUM;
config.pin_href = HREF_GPIO_NUM;
config.pin_sscb_sda = SIOD_GPIO_NUM;
config.pin_sscb_scl = SIOC_GPIO_NUM;
config.pin_pwdn = PWDN_GPIO_NUM;
config.pin_reset = RESET_GPIO_NUM;
config.xclk_freq_hz = 20000000;
config.pixel_format = PIXFORMAT_JPEG;
//判断 若有PSRAM则质量更高一些
if (psramFound()) { //有PSRAM硬件,更大的ram空间
Serial.println("psramFound!"); //此时io16被占用 CS
switch(frame_size_num){ //FRAMESIZE_ + QVGA|CIF|VGA|SVGA|XGA|SXGA|UXGA
case 0: config.frame_size = FRAMESIZE_QQVGA; break; //QQVGA (160 x 120)
case 1: config.frame_size = FRAMESIZE_QQVGA2; break; //QQVGA2 (128 x 160)
//HQVGA
case 2: config.frame_size = FRAMESIZE_QVGA; break; //QVGA (320 x 240)
case 3: config.frame_size = FRAMESIZE_CIF; break; //CIF (352 x 288)
case 4: config.frame_size = FRAMESIZE_VGA; break; //VGA (640 x 480)
case 5: config.frame_size = FRAMESIZE_SVGA; break; //SVGA (800 x 600)
case 6: config.frame_size = FRAMESIZE_XGA; break; //XGA (1024 x 768)
case 7: config.frame_size = FRAMESIZE_SXGA; break; //SXGA (1280 x 1024)
case 8: config.frame_size = FRAMESIZE_UXGA; break; //UXGA (1600 x 1200)
default: frame_size_num=3;config.frame_size = FRAMESIZE_SVGA; break;
}
Serial.printf("frame_size = %d [0-6]\r\n", frame_size_num);
Serial.printf("jpeg_quality = %d [0-xx]\r\n", jpeg_quality_num);
// config.frame_size = FRAMESIZE_UXGA;
config.jpeg_quality = jpeg_quality_num; //10; //越小越好
config.fb_count = 2;
} else { //没有则质量低一些
config.frame_size = FRAMESIZE_SVGA;
config.jpeg_quality = 12;
config.fb_count = 1;
}
esp_err_t err = esp_camera_init(&config); //摄像头初始化
if (err != ESP_OK) { //若初始化失败
Serial.printf("Camera init failed with error 0x%x", err);
return false;
}
else return true;
}
//只截取显示最前160x120图片 简单快速 需要自己判断边界 默认是mcu整数倍
void renderJPEG_160x120_cut(int ypos=8) { //81ms
//检索关于图像的信息
uint16_t mcu_w = JpegDec.MCUWidth; //最小编码单元的宽 后续是当前mcu左上坐标
uint16_t mcu_h = JpegDec.MCUHeight; //最小编码单元的高
uint32_t drawTime = millis(); //有关计算耗时
//读取每个MCU块
while (JpegDec.readSwappedBytes()) {
//计算图像块应该画在屏幕上的什么位置
int mcu_x = JpegDec.MCUx * mcu_w ;
int mcu_y = JpegDec.MCUy * mcu_h + ypos;
// 仅当图像适合屏幕时,才绘制图像MCU块
if (( mcu_x + mcu_w ) <= tft.width() && ( mcu_y + mcu_h ) <= tft.height()) //将显示的还在屏幕内
{
tft.pushRect(mcu_x, mcu_y, mcu_w, mcu_h, JpegDec.pImage); //显示屏幕位置上 图像数据块
}
else if ( (mcu_y + mcu_h) >= tft.height()){
JpegDec.abort(); // 图像已溢出屏幕底部,因此中止解码
break;
}
} //while结束
// 计算绘制图像需要多长时间
drawTime = millis() - drawTime;
Serial.print(F( "Total render time was : ")); Serial.print(drawTime); Serial.println(F(" ms"));
Serial.println(F(""));
}
//只显示 160x120图像,先解码再显示
void renderJPEG_160x120xx(int ypos=8) { //不知为啥的到定义3维数组就复位
//espcam中 mcu_w=16,mcu_h=8
//检索关于图像的信息
uint16_t mcu_w = JpegDec.MCUWidth; //最小编码单元的宽 后续是当前mcu左上坐标
uint16_t mcu_h = JpegDec.MCUHeight; //最小编码单元的高
uint32_t drawTime = millis(); //有关计算耗时
uint16_t cImg[10][15][128]; //存放解码后的数据 10x15的网格内,有128个数据点
//uint16_t *cImg = (expStruct *) ps_malloc(MAX_EXPANDER * sizeof(expStruct));
//读取每个MCU块
while (JpegDec.readSwappedBytes()) {
Serial.print("x,y: ");
Serial.print(JpegDec.MCUx);
Serial.print(",");
Serial.println(JpegDec.MCUy);
if (JpegDec.MCUx >= 10 || JpegDec.MCUy >= 15) break;
for(int j=0;j<128;j++){
cImg[JpegDec.MCUx][JpegDec.MCUy][j]=JpegDec.pImage[j];
}
}
Serial.println("jiexi ok");
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
tft.pushRect(i*mcu_w, j*mcu_h+ypos, mcu_w, mcu_h, cImg[i][j]); //显示屏幕位置上 图像数据块
}
}
// 计算绘制图像需要多长时间
drawTime = millis() - drawTime;
Serial.print(F( "Total render time was : ")); Serial.print(drawTime); Serial.println(F(" ms"));
Serial.println(F(""));
}
void renderJPEG_160x120DMA(int ypos=8) { //使用dma的方式 45ms 屏幕刷新不闪烁!
//espcam中 mcu_w=16,mcu_h=8
//检索关于图像的信息
uint16_t mcu_w = JpegDec.MCUWidth; //最小编码单元的宽 后续是当前mcu左上坐标
uint16_t mcu_h = JpegDec.MCUHeight; //最小编码单元的高
uint32_t drawTime = millis(); //有关计算耗时
//uint16_t cImg[150][128] EXT_RAM_ATTR; //存放解码后的数据 10x15的网格内,有128个数据点
// 必须首先使用startWrite,以便在DMA和SPI通道设置保持配置期间TFT片选保持低电平
tft.startWrite();
//读取每个MCU块
while (JpegDec.readSwappedBytes()) {
// Serial.print("x,y: ");
// Serial.print(JpegDec.MCUx);
// Serial.print(",");
// Serial.println(JpegDec.MCUy);
if ( JpegDec.MCUy >= tft.height() ) break;
if (dmaBufferSel) dmaBufferPtr = dmaBuffer2;
else dmaBufferPtr = dmaBuffer1;
dmaBufferSel = !dmaBufferSel; //交替选择 缓冲区
//仅当最后一次DMA未完成时,才启动DMA阻塞
tft.pushImageDMA(JpegDec.MCUx * mcu_w, JpegDec.MCUy * mcu_h + ypos, mcu_w, mcu_h, JpegDec.pImage, dmaBufferPtr);
}
// 必须使用endWrite来释放TFT片选并释放SPI通道
tft.endWrite();
// 计算绘制图像需要多长时间
drawTime = millis() - drawTime;
Serial.print(F( "Total render time was : ")); Serial.print(drawTime); Serial.println(F(" ms"));
Serial.println(F(""));
}
//将320x240图片 缩放为160x120 显示 简单快速 需要自己判断边界 默认是mcu整数倍
void renderJPEG_320x240to160x120(int ypos=8) { // 提取一半的像素点,非像素合并
//默认mcu大小: <=16x16
//检索关于图像的信息
uint16_t cImg[16*16]; //重新组合起来的mcu数据 好像不用指定大小
uint16_t mcu_w = JpegDec.MCUWidth/2; //最小编码单元的宽 后续是当前mcu左上坐标
uint16_t mcu_h = JpegDec.MCUHeight/2; //最小编码单元的高
uint32_t drawTime = millis(); //有关计算耗时
//读取每个MCU块
while (JpegDec.readSwappedBytes()) {
for (int i = 0; i < mcu_w*mcu_h*4; i++) //间隔复制数据
{
*(cImg+i) = *(JpegDec.pImage + i*2 );
}
//计算图像块应该画在屏幕上的什么位置
int mcu_x = JpegDec.MCUx * mcu_w ;
int mcu_y = JpegDec.MCUy * mcu_h + ypos;
//绘制图像块
tft.pushRect(mcu_x, mcu_y, mcu_w, mcu_h, cImg); //显示屏幕位置上 图像数据块
} //while结束
// 计算绘制图像需要多长时间
drawTime = millis() - drawTime;
Serial.print(F( "Total render time was : ")); Serial.print(drawTime); Serial.println(F(" ms"));
Serial.println(F(""));
}
//返回小的数值
#define minimum(a,b) (((a) < (b)) ? (a) : (b))
//####################################################################################################
void setup() {
Serial.begin(115200);
Serial.println("【项目】: esp32 cam tft 摄像机");
tft.begin();
//tft.spi_end();
//tft.setTextColor(TFT_WHITE, TFT_BLACK);
//tft.fillScreen(TFT_BLACK);
tft.initDMA(); //初始化对应DMA
//TJpgDec.setJpgScale(1); //这个库可以解码缩放图像
esp_camera_deinit(); //摄像头去初始化
pinMode(32,OUTPUT ); // 32是 cam电源控制引脚
digitalWrite(32, 0); // 猜测 低电平通电 !在睡眠期间可能无法控制断电!
delay(100);
digitalWrite(32, 1); // 猜测高电平 断电 cam的
delay(100);
pinMode(32,INPUT ); //释放 引脚
if(camera_init(frame_size_num1,jpeg_quality_num1)==true) Serial.println("camera init ok!"); //默认是 FRAMESIZE_UXGA
else{
Serial.println("camera init error!");
return;
}
}
void loop() {
Serial.println("Taking picture...");
esp_err_t res = ESP_OK;
fb = esp_camera_fb_get(); //拍照 返回照片指针
if (!fb) { //拍照失败
Serial.println("Camera capture failed!");
}
else{
// Serial.println("pic_fast 160x120_cut");
// tft.setRotation(3); //显示方向 横向
// tft.fillScreen(TFT_BLACK);
// JpegDec.decodeArray(fb->buf, fb->len); //解码 jpg
// //jpegInfo(); // 打印JPEG文件中的信息
// renderJPEG_160x120_cut(8); //固定偏移 8,0 160x120 48ms 320x240下83ms
// Serial.println("#########################");
// delay(300);
tft.setRotation(3); //显示方向 横向
//tft.fillScreen(TFT_BLACK);
JpegDec.decodeArray(fb->buf, fb->len); //解码 jpg
Serial.println("decode ok");
//jpegInfo(); // 打印JPEG文件中的信息
renderJPEG_160x120DMA(8); //固定偏移 卡机?
Serial.println("#########################");
//delay(1000);
// Serial.println("pic_fast 320x240to160x120");
// tft.setRotation(3); //显示方向 横向
// tft.fillScreen(TFT_BLACK);
// JpegDec.decodeArray(fb->buf, fb->len); //解码 jpg
// jpegInfo(); // 打印JPEG文件中的信息
// renderJPEG_320x240to160x120(8); //固定偏移 8,0 164ms
// Serial.println("#########################");
// delay(1000);
esp_camera_fb_return(fb); //应该是销毁图片指针
// Serial.println("Camera capture ok drawArrayJpeg");
// tft.setRotation(3); // 设置显示方向 横向
// tft.fillScreen(TFT_BLACK); //填充背景色
// drawArrayJpeg(fb->buf, fb->len, 0, 0); //87ms 绘制内存中的jpg, 偏移下x,y位置
// //(const char *)
// esp_camera_fb_return(fb); //应该是销毁图片指针
// delay(5000);
}
// Serial.println("Mouse 1");
// tft.setRotation(3); //显示方向 横向
// tft.fillScreen(TFT_BLACK);
// drawArrayJpeg(Mouse160, sizeof(Mouse160), 0, 11); // 52ms 偏移原点为 横向的左上角
// delay(1000);
}
//####################################################################################################
// 绘制 jpg 到 tft
//####################################################################################################
void drawArrayJpeg(const uint8_t arrayname[], uint32_t array_size, int xpos, int ypos) {
JpegDec.decodeArray(arrayname, array_size); //解码 jpg
jpegInfo(); // 打印JPEG文件中的信息
renderJPEG(xpos, ypos); //根据偏移 绘制图像到tft
Serial.println("#########################");
}
//####################################################################################################
// 在TFT上画一个JPEG,如果图像大小不合适,将在右侧/底部裁剪
//####################################################################################################
void renderJPEG(int xpos, int ypos) {
//检索关于图像的信息
uint16_t *pImg;
uint16_t mcu_w = JpegDec.MCUWidth; //最小编码单元的宽 后续是当前mcu左上坐标
uint16_t mcu_h = JpegDec.MCUHeight; //最小编码单元的高
uint32_t max_x = JpegDec.width; //照片宽度 后续是图片整体显示位置的右下坐标
uint32_t max_y = JpegDec.height; //照片高度
//Jpeg图像被绘制为一组称为最小编码单元(MCU)图像块(图块)
//通常这些MCU是16x16像素块
//确定右边缘和下边缘图像块的宽度和高度
uint32_t min_w = minimum(mcu_w, max_x % mcu_w);
uint32_t min_h = minimum(mcu_h, max_y % mcu_h);
// 保存当前图像块大小 有关最右边、最下边 图像块 不是mcu的1倍时,选小的
uint32_t win_w = mcu_w; //当前mcu的 宽高
uint32_t win_h = mcu_h;
// record the current time so we can measure how long it takes to draw an image
uint32_t drawTime = millis();
//保存右边缘和下边缘的坐标,以帮助图像裁剪到屏幕大小
max_x += xpos;
max_y += ypos;
//读取每个MCU块,直到不再有
while (JpegDec.readSwappedBytes()) {
// 保存指向图像块的指针
pImg = JpegDec.pImage ; //当前图像块 的数据指针
//计算图像块应该画在屏幕上的什么位置
int mcu_x = JpegDec.MCUx * mcu_w + xpos; // 计算当前MCU左上角的坐标
int mcu_y = JpegDec.MCUy * mcu_h + ypos;
// 检查右边缘的图像块大小是否需要更改
if (mcu_x + mcu_w <= max_x) win_w = mcu_w;
else win_w = min_w;
// 检查下边缘的图像块大小是否需要更改
if (mcu_y + mcu_h <= max_y) win_h = mcu_h;
else win_h = min_h;
// 将像素复制到连续块中 好像在这没有用处
// if (win_w != mcu_w)
// {
// uint16_t *cImg;
// int p = 0;
// cImg = pImg + win_w;
// for (int h = 1; h < win_h; h++)
// {
// p += mcu_w;
// for (int w = 0; w < win_w; w++) //宽度上 横向复制
// {
// *cImg = *(pImg + w + p);
// cImg++;
// }
// }
// }
// 仅当图像适合屏幕时,才绘制图像MCU块
if (( mcu_x + win_w ) <= tft.width() && ( mcu_y + win_h ) <= tft.height()) //将显示的还在屏幕内
{
tft.pushRect(mcu_x, mcu_y, win_w, win_h, pImg); //显示屏幕位置上 图像数据块
}
// 图像已溢出屏幕底部,因此中止解码
else if ( (mcu_y + win_h) >= tft.height()) JpegDec.abort();
} //while结束
// 计算绘制图像需要多长时间
drawTime = millis() - drawTime;
Serial.print(F( "Total render time was : ")); Serial.print(drawTime); Serial.println(F(" ms"));
Serial.println(F(""));
}
//####################################################################################################
// 打印JPEG文件中的信息 解码出来的
//####################################################################################################
void jpegInfo() {
Serial.println(F("==============="));
Serial.println(F("JPEG image info"));
Serial.println(F("==============="));
Serial.print(F( "Width :")); Serial.println(JpegDec.width);
Serial.print(F( "Height :")); Serial.println(JpegDec.height);
Serial.print(F( "Components :")); Serial.println(JpegDec.comps);
Serial.print(F( "MCU / row :")); Serial.println(JpegDec.MCUSPerRow);
Serial.print(F( "MCU / col :")); Serial.println(JpegDec.MCUSPerCol);
Serial.print(F( "Scan type :")); Serial.println(JpegDec.scanType);
Serial.print(F( "MCU width :")); Serial.println(JpegDec.MCUWidth);
Serial.print(F( "MCU height :")); Serial.println(JpegDec.MCUHeight);
Serial.println(F("==============="));
}
//####################################################################################################
// 显示执行时间
//####################################################################################################
void showTime(uint32_t msTime) {
//tft.setCursor(0, 0);
//tft.setTextFont(1);
//tft.setTextSize(2);
//tft.setTextColor(TFT_WHITE, TFT_BLACK);
//tft.print(F(" JPEG drawn in "));
//tft.print(msTime);
//tft.println(F(" ms "));
Serial.print(F(" JPEG drawn in "));
Serial.print(msTime);
Serial.println(F(" ms "));
}
C++
1
https://gitee.com/ventim/esp32cam-camera.git
git@gitee.com:ventim/esp32cam-camera.git
ventim
esp32cam-camera
22.7 esp32cam多功能摄像机
master

搜索帮助