在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)

在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶

  • 例程说明
  • 源码下载目录
  • 工程配置
  • 一、SDL2的初始化和退出
  • 二、OLED画点和读点
  • 三、更新OLDE的GRAM
  • 四、清屏和清某区域
  • 五、点阵字库
  • 六、显示字符串
  • 七、显示中文字符
  • 八、显示图片
  • 九、测试代码
  • 十、主函数
  • 十一、运行结果

例程说明

参考例程: 在CodeBlocks下搭建SDL2开发工程
参考例程: STM32F103xx TFT液晶显示ASCII字符串、中文、图片并且显示带有镜像和旋转功能

1. 在CodeBlocks下搭建SDL2工程,并且虚拟OLED单色液晶的显示

源码下载目录

源码下载目录: 在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)

工程配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

一、SDL2的初始化和退出


/* 初始化SDL2 */
static u8 xInit_SDL2(void)
{/* 初始化SDL */if (SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0){SDL_Log("SDL Init Fail......%s\r\n", SDL_GetError());return 1;}/* 创建窗口 */AppMainWin = SDL_CreateWindow("SDL2 Demo", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_PHY_WIDTH, WINDOW_PHY_HEIGHT, SDL_WINDOW_SHOWN);if (AppMainWin == NULL){SDL_Log("SDL Create Window Fail......%s\r\n", SDL_GetError());return 2;}/* 创建渲染器 */AppRender = SDL_CreateRenderer(AppMainWin, -1, SDL_RENDERER_ACCELERATED);if (AppRender == NULL){SDL_Log("SDL Create Renderer......%s", SDL_GetError());return 3;}// 清空渲染器SDL_Rect rect = {0, 0, (OLED_PHY_XWIDTH * A_PIXEL_SIZE), (OLED_PHY_YHEIGHT * A_PIXEL_SIZE)};SDL_RenderClear(AppRender);SDL_SetRenderDrawColor(AppRender, OLED_DEF_BACK_COLOR); //背景色SDL_RenderFillRect(AppRender, &rect);SDL_RenderPresent(AppRender);return 0;
}/* 退出SDL2 */
static void vQuit_SDL2(void)
{SDL_Log("Complier Date: %s  %s\r\n", __DATE__, __TIME__);/* 销毁渲染器 */if (AppRender != NULL)  SDL_DestroyRenderer(AppRender);/* 销毁窗口 */if (AppMainWin != NULL) SDL_DestroyWindow(AppMainWin);/* 退出SDL */SDL_Quit();
}

二、OLED画点和读点


/* 画点 */
void vOLED_DrawPoint(u16 x, u16 y, u8 mode)
{u8  yTemp = 0;u16 yPost = 0;yPost = y / 8; /* 页位置 */yTemp = 0x01 << (y % 8); /* 页偏移位置 */if (mode) OLED_DISP_GRAM[x][yPost] |= yTemp;    /* 置位 */else      OLED_DISP_GRAM[x][yPost] &= (~yTemp); /* 清零 */
}/* 读点 */
u8 xOLED_ReadPoint(u16 x, u16 y)
{u8  yTemp = 0;u16 yPost = 0;yPost = y / 8; /* 页位置 */yTemp = 0x01 << (y % 8); /* 页偏移位置 */return ((OLED_DISP_GRAM[x][yPost] & yTemp) ? 0x01 : 0x00);
}

三、更新OLDE的GRAM


/* 写GRAM */
void vOLED_UpdateGRAM(void)
{// SDL_Log("OLED Update Start......%llu\r\n", SDL_GetTicks64());SDL_Rect rect = {0, 0, A_PIXEL_SIZE, A_PIXEL_SIZE};u16 x = 0, y = 0, i = 0;u8  dat = 0;for (x = 0; x < OLED_DISP_GRAM_XWIDTH_MAX; ++x){rect.x = x * A_PIXEL_SIZE;/* 实际绘制X */for (y = 0; y < OLED_DISP_GRAM_YHEIGHT_MAX; ++y){dat = OLED_DISP_GRAM[x][y];for (i = 0; i < 8; ++i){rect.y = ((y << 3) + i) * A_PIXEL_SIZE;/* 实际绘制Y */if ((dat >> i) & 0x01) SDL_SetRenderDrawColor(AppRender, OLED_DEF_FORE_COLOR); //前景色else                   SDL_SetRenderDrawColor(AppRender, OLED_DEF_BACK_COLOR); //背景色SDL_RenderFillRect(AppRender, &rect); // 填充矩形}}}SDL_RenderPresent(AppRender); /* 更新屏幕 */// SDL_Log("OLED Update End......%llu\r\n", SDL_GetTicks64());
}

四、清屏和清某区域

/* 清屏 */
void vOLED_ClearScreen(void)
{u16 x = 0, y = 0;for (x = 0; x < OLED_DISP_GRAM_XWIDTH_MAX; ++x){for (y = 0; y < OLED_DISP_GRAM_YHEIGHT_MAX; ++y){OLED_DISP_GRAM[x][y] = 0;}}SDL_Rect rect = {0, 0, (OLED_PHY_XWIDTH * A_PIXEL_SIZE), (OLED_PHY_YHEIGHT * A_PIXEL_SIZE)};SDL_SetRenderDrawColor(AppRender, OLED_DEF_BACK_COLOR);SDL_RenderFillRect(AppRender, &rect);SDL_RenderPresent(AppRender);
}void vOLED_ClearArea(u16 x0, u16 y0, u16 x1, u16 y1, u8 mode)
{u16 x = 0, y = 0;for (x = x0; x <= x1; x++){for (y = y0; y <= y1; y++){if ((x < AppDevOLED.xWidth) && (y < AppDevOLED.yHeight)){vOLED_DrawPoint(x, y, mode); }       }}
}

五、点阵字库

/****************************************************************************************************(0) !(1)  "(2)  #(3)  $(4)  %(5)  &(6)  '(7)  ((8)  )(9)  *(10) +(11) ,(12) -(13) .(14) /(15)
0(16) 1(17) 2(18) 3(19) 4(20) 5(21) 6(22) 7(23) 8(24) 9(25) :(26) ;(27) <(28) =(29) >(30) ?(31)
@(32) A(33) B(34) C(35) D(36) E(37) F(38) G(39) H(40) I(41) J(42) K(43) L(44) M(45) N(46) O(47)
P(48) Q(49) R(50) S(51) T(52) U(53) V(54) W(55) X(56) Y(57) Z(58) [(59) \(60) ](61) ^(62) _(63)
`(64) a(65) b(66) c(67) d(68) e(69) f(70) g(71) h(72) i(73) j(74) k(75) l(76) m(77) n(78) o(79)
p(80) q(81) r(82) s(83) t(84) u(85) v(86) w(87) x(88) y(89) z(90) {(91) |(92) }(93) ~(94)* ASCII常规字符集:
* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
*
* 1. PCtoLCD2018.exe : 宋体 + 阴码 + 逐列式 + 逆向(低位在前) + C51格式 + 等比缩放
* 2. 英文长宽点阵集(6x12),字宽(12),字高(12)
****************************************************************************************************/
const unsigned char ASCII_FONT_1206[95][12] = 
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/{0x00,0x00,0x00,0x00,0x7C,0x02,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/{0x00,0x00,0x04,0x00,0x03,0x00,0x04,0x00,0x03,0x00,0x00,0x00},/*""",2*/{0x90,0x00,0xFC,0x03,0x90,0x00,0xFC,0x03,0x90,0x00,0x00,0x00},/*"#",3*/{0x18,0x01,0x24,0x02,0xFE,0x07,0x44,0x02,0x88,0x01,0x00,0x00},/*"$",4*/{0x38,0x00,0x44,0x03,0xF8,0x00,0xD0,0x01,0x2C,0x02,0xC0,0x01},/*"%",5*/{0xC0,0x01,0x38,0x02,0xE4,0x02,0x18,0x01,0xE0,0x02,0x20,0x01},/*"&",6*/{0x04,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/{0x00,0x00,0x00,0x00,0xF8,0x00,0x06,0x03,0x01,0x04,0x00,0x00},/*"(",8*/const unsigned char ASCII_FONT_1608[95][16] = 
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/{0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/{0x00,0x00,0x10,0x00,0x0C,0x00,0x02,0x00,0x10,0x00,0x0C,0x00,0x02,0x00,0x00,0x00},/*""",2*/{0x00,0x00,0x40,0x04,0xC0,0x3F,0x78,0x04,0x40,0x04,0xC0,0x3F,0x78,0x04,0x00,0x00},/*"#",3*/{0x00,0x00,0x70,0x18,0x88,0x20,0x88,0x20,0xFC,0xFF,0x08,0x21,0x30,0x1E,0x00,0x00},/*"$",4*/{0xF0,0x00,0x08,0x31,0xF0,0x0C,0x80,0x03,0x60,0x1E,0x18,0x21,0x00,0x1E,0x00,0x00},/*"%",5*/{0x00,0x1E,0xF0,0x21,0x08,0x23,0x88,0x2C,0x70,0x19,0x00,0x27,0x00,0x21,0x00,0x10},/*"&",6*/{0x00,0x00,0x12,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/{0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x07,0x18,0x18,0x04,0x20,0x02,0x40,0x00,0x00},/*"(",8*/const unsigned char ASCII_FONT_2412[95][36] = 
{{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x77,0x1C,0xF0,0x0F,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x1C,0x00,0x00,0x8C,0x00,0x00,0x60,0x00,0x00,0x30,0x00,0x00,0x1C,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00},/*""",2*/{0x00,0x00,0x00,0x00,0x83,0x01,0x00,0x83,0x1F,0x00,0xFF,0x01,0xF0,0x83,0x01,0x00,0x83,0x01,0x00,0x83,0x01,0x00,0x83,0x01,0x00,0xFB,0x1F,0xF0,0x87,0x01,0x00,0x83,0x01,0x00,0x00,0x00},/*"#",3*/{0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x07,0xC0,0x07,0x0F,0x60,0x0C,0x12,0x20,0x18,0x10,0xF8,0xFF,0x7F,0x20,0x71,0x10,0xE0,0xE1,0x0F,0xC0,0x81,0x07,0x00,0x00,0x00,0x00,0x00,0x00},/*"$",4*/{0xC0,0x07,0x00,0x30,0x18,0x00,0x10,0x10,0x18,0x30,0x18,0x07,0xC0,0xCF,0x00,0x00,0x38,0x00,0x00,0xC6,0x07,0xC0,0x31,0x18,0x30,0x10,0x10,0x00,0x30,0x18,0x00,0xC0,0x07,0x00,0x00,0x00},/*"%",5*/{0x00,0xC0,0x07,0x00,0xE0,0x0F,0xE0,0x17,0x18,0xF0,0x3F,0x10,0x10,0xF8,0x10,0xF0,0xC7,0x13,0xE0,0x03,0x0F,0x00,0x08,0x0E,0x00,0xF8,0x19,0x00,0x08,0x10,0x00,0x08,0x10,0x00,0x00,0x0C},/*"&",6*/{0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x00,0x00,0x4C,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x80,0x01,0x03,0x60,0x00,0x0C,0x10,0x00,0x10,0x08,0x00,0x20,0x04,0x00,0x40,0x00,0x00,0x00},/*"(",8*/

六、显示字符串

/* 获取字符数据源地址 */
static void vGet_CharSrc(u8 chr, u8 charSize, u8 ** pSrc)
{switch (charSize){case ASCII_FONT_TYPE_1206 : *pSrc = (u8 *)(&ASCII_FONT_1206[chr - ' ']); break;case ASCII_FONT_TYPE_1608 : *pSrc = (u8 *)(&ASCII_FONT_1608[chr - ' ']); break;case ASCII_FONT_TYPE_2412 : *pSrc = (u8 *)(&ASCII_FONT_2412[chr - ' ']); break;default: *pSrc = NULL; break;}
}/* 显示字符 */
static void vOLED_DisplayChar(u16 x, u16 y, u8 chr, u8 charSize)
{u8 charByte = 0, k = 0, i = 0;u8 dat = 0, * pSrcDat = NULL;u16 y0 = y;//获取字符数据源地址vGet_CharSrc(chr, charSize, &pSrcDat);if (pSrcDat == NULL) return;// 字符点阵占用字节数charByte = ((charSize >> 3) + ((charSize & 0x07) ? 1 : 0)) * (charSize >> 1);// 遍历字符点阵数据for(k = 0; k < charByte; ++k){dat = pSrcDat[k];for(i = 0; i < 8; ++i){// 显示有效范围if ((x < AppDevOLED.xWidth) && (y < AppDevOLED.yHeight)){//低位在前if ((dat >> i) & 0x01) vOLED_DrawPoint(x, y, 1);//正常模式else                   vOLED_DrawPoint(x, y, 0);//清空模式}y++;// 纵坐标自加if (XABS2(y , y0) >= charSize)//纵坐标偏移量等于字符点阵高度{y = y0;x++;break;}}}
}/* 显示字符串 */
void vOLED_DisplayString(u16 x, u16 y, u8 * pStr, u8 strSize)
{//显示ASCII常规字符while ((*pStr >= ' ') && (*pStr <= '~')){/* 剩余的横纵小于字体宽度 换行显示 */if ((x + (strSize >> 1)) >= AppDevOLED.xWidth){y += strSize;x  = 0;}/* 剩余纵轴小于字体高度 */if ((y + strSize) >= AppDevOLED.yHeight){return;}vOLED_DisplayChar(x, y, *pStr, strSize);x += (strSize >> 1);pStr++;}
}

七、显示中文字符

/* 显示中文字符串 */
void vOLED_Display_ChineseString(u16 x, u16 y, u16 xWidth, u16 yHeight, u8 * pData, u16 num)
{u16 i = 0;u8 charByte = 0;u8 * pMem = pData;/* 异常 */if ((!num) || (pData == NULL)){return;}// 字符点阵占用字节数charByte = ((yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0)) * xWidth;for (i = 0; i < num; ++i){/* 剩余纵轴小于字体高度 */if ((y + yHeight) >= AppDevOLED.yHeight){return;}/* 剩余的横纵小于字体宽度 换行显示 */if ((x + xWidth) > AppDevOLED.xWidth){y += yHeight;x  = 0;}pMem = pData + (charByte * i);vOLED_Display_ChineseChar(x, y, xWidth, yHeight, pMem);x += xWidth;}
}

八、显示图片


/* 图片显示 */
void vOLED_Display_Picture(u16 x, u16 y, u16 xWidth, u16 yHeight, const u8 * pImage)
{u16 k = 0, j = 0, i = 0, n = 0;u16 yMax = 0, y0 = y;u8  dat   = 0;yMax = (yHeight >> 3) + ((yHeight & 0x07) ? 1 : 0); //图片高度y0 = y; //原始纵坐标//图片宽度for(k = 0; k < xWidth; k++){for(j = 0; j < yMax; j++){dat = pImage[n++];for(i = 0; i < 8; i++){if ((y < AppDevOLED.yHeight) && (x < AppDevOLED.xWidth)){//低位在前if ((dat >> i) & 0x01) vOLED_DrawPoint(x, y, 1);//正常模式else                   vOLED_DrawPoint(x, y, 0);//清空模式}y++;//纵坐标处理if (XABS2(y , y0) >= yHeight){y = y0;x++;//横坐标处理break;}}}}
}

九、测试代码

/* 正常显示 */
static void vOLED_Test_Show_Normal(void)
{static uint8 count = 0;vOLED_DisplayString(2, 0, (u8 *)"Normal Show Demo", ASCII_FONT_TYPE_1206);vOLED_ClearArea(0, 13, AppDevOLED.xWidth, AppDevOLED.yHeight, 0);if ((++count) > 4) count = 0;switch (count){case 0:{vOLED_DisplayString(2, 13, (u8 *)"Str:12x06", ASCII_FONT_TYPE_1206);vOLED_DisplayString(40, 36, (u8 *)"ABCDE12345678aabcdefghi?#$^&*()-=+[]<>", ASCII_FONT_TYPE_1206);}break;case 1:{vOLED_DisplayString(2, 13, (u8 *)"Str:16x08:", ASCII_FONT_TYPE_1206);vOLED_DisplayString(32, 36, (u8 *)"ABC123", ASCII_FONT_TYPE_1608);}break;case 2:{vOLED_DisplayString(2, 13, (u8 *)"Str:24x12:", ASCII_FONT_TYPE_1206);vOLED_DisplayString(18, 34, (u8 *)"ABC123", ASCII_FONT_TYPE_2412);}break;case 3:{vOLED_DisplayString(2, 13, (u8 *)"Chin:18x18", ASCII_FONT_TYPE_1206);vOLED_Display_ChineseString(1, 37, 18, 18, (u8 *)&ChineseDemo[1], 7);}break;case 4:{vOLED_DisplayString(2, 13, (u8 *)"Pic:73x36", ASCII_FONT_TYPE_1206);vOLED_Display_Picture(53, 25, 73, 36, gImage_VER1_73x36);}break;default: break;}
}void vOLED_Test(void)
{vOLED_Test_Show_Normal();vOLED_UpdateGRAM();ubSuperTimer_Start(vOLED_Test, 2000);}

十、主函数

在这里插入图片描述


int main( int argc, char * argv[])
{Uint64 curTick = 0;SDL_Event event = {0};uint8 quitFlg = 1;if (xInit_SDL2()) return -1;xSuperTimer_Init();vOLED_Init();ubSuperTimer_Start(vOLED_Test , 500);curTick = SDL_GetTicks64();while (quitFlg){if (SDL_PollEvent(&event)){switch (event.type){case SDL_QUIT: quitFlg = 0; break;case SDL_KEYDOWN:{switch (event.key.keysym.sym){case SDLK_UP:    SDL_Log("SDLK_UP......\r\n");    break;case SDLK_DOWN:  SDL_Log("SDLK_DOWN......\r\n");  break;case SDLK_LEFT:  SDL_Log("SDLK_LEFT......\r\n");  break;case SDLK_RIGHT: SDL_Log("SDLK_RIGHT......\r\n"); break;default: break;}}break;default: break;}}if (((uint64)(SDL_GetTicks64() - curTick)) > 0){vSuperTimer_IncTick();curTick = SDL_GetTicks64();}vSuperTimer_RunHandler();}vQuit_SDL2();return 1;
}

十一、运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/404319.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

05 serv00安装typecho

下载 ‍ cd domain/xxx.serv00.net/# 下载typecho git clone https://github.com/typecho/typecho.git# 当前有两个目录 typecho/ 和 public_html/ ls# 替换html rm -rf public_html/ mv typecho public_html‍ 安装 浏览器访问你的网站 xxx.serv0.net&#xff0c;看见 type…

8月15日笔记

masscan安装使用 首先需要有c编译器环境。查看是否有c编译器环境&#xff1a; gcc -v如果系统中已经安装了 GCC&#xff0c;这个命令将输出 GCC 的版本信息。如果未安装&#xff0c;你会看到类似于 “command not found” 的错误消息。 如果没有下载&#xff0c;使用如下命令…

万维网与HTTP协议:基础知识简明指南

引言 在当今的数字时代&#xff0c;了解万维网&#xff08;World Wide Web, WWW&#xff09;和HTTP协议&#xff08;Hyper Text Transfer Protocol&#xff09;是至关重要的。本文将为基础小白们简明扼要地介绍万维网及其核心协议HTTP&#xff0c;并通过简单的例子和清晰的段落…

C语言内存操作函数

目录 一. C语言内存操作函数 1. memcpy的使用和模拟实现 2. memmove函数 3. memset函数 4. memcmp函数 一. C语言内存操作函数 随着知识的不断积累&#xff0c;我们所想要实现的目标程序就会更加复杂&#xff0c;今天我们来学习一个新的知识叫做C语言内存操作函数&#x…

基于Python的火车票售票系统/基于django的火车购票系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

面试经典算法150题系列-最长公共前缀

最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

集合的知识点

一、集合的简介 1.1 什么是集合 集合(Collection)&#xff0c;也是一个数据容器&#xff0c;类似于数组&#xff0c;但是和数组是不一样的。集合是一个可变的容器&#xff0c;可以随时向集合集合中添加元素&#xff0c;也可以随时从集合中删除元素。另外&#xff0c;集合还提…

鸿蒙(API 12 Beta3版)【录像流二次处理(C/C++)】媒体相机开发指导

通过ImageReceiver创建录像输出&#xff0c;获取录像流实时数据&#xff0c;以供后续进行图像二次处理&#xff0c;比如应用可以对其添加滤镜算法等。 开发步骤 导入NDK接口&#xff0c;接口中提供了相机相关的属性和方法&#xff0c;导入方法如下。 // 导入NDK接口头文件#in…

使用python实现3D聚类图

实验记录&#xff0c;在做XX得分预测的实验中&#xff0c;做了一个基于Python的3D聚类图&#xff0c;水平有限&#xff0c;仅供参考。 一、以实现三个类别聚类为例 代码&#xff1a; import pandas as pd import numpy as np from sklearn.decomposition import PCA from sk…

开源版最新LoveCardsV2表白墙源码下载

源码亮点 模板系统&#xff0c;给你无限可能 卡片不限字数&#xff0c;支持多图片上传 支持评论&#xff0c;点赞&#xff0c;让互动性拉满 管理后台可添加多个管理员 卡片一键分享至多平台 卡片浏览次数统计 发行版开箱即用 部署教程 1. 环境&#xff08;参考开发环境&…

XSS- DOMclobbering与svg深度利用

目录 源码展示 解法一&#xff1a;绕过过滤-DOM clobbering 什么是DOM clobbering DOM clobbering原理 全局变量自动创建 属性名冲突 影响脚本执行 逐过程分析 源码展示 <script>const data decodeURIComponent(location.hash.substr(1));;const root documen…

图像处理之:Video Processing Subsystem(三)

免责声明&#xff1a; 本文所提供的信息和内容仅供参考。作者对本文内容的准确性、完整性、及时性或适用性不作任何明示或暗示的保证。在任何情况下&#xff0c;作者不对因使用本文内容而导致的任何直接或间接损失承担责任&#xff0c;包括但不限于数据丢失、业务中断或其他经济…

【硬件模块】震动传感器模块

震动传感器模块实物图 DO&#xff1a;数字信号量输出&#xff0c;接单片机管脚&#xff1b; AO&#xff1a;模拟输出&#xff0c;无效&#xff0c;一般不接。 无震动&#xff0c;DO输出高电平&#xff0c;信号指示灯灭&#xff1b; 有震动&#xff0c;DO输出低电平&#xff0c;…

DHCP的原理与配置

目录 DHCP的原理 DHCP是什么 DHCP的好处 DHCP的分配方式 DHCP的工作原理 DHCP的配置 环境设置 DHCP配置 验证配置是否成功 DHCP的原理 DHCP是什么 DHCP:Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议。由Internet工作小组开发&#xff0c;专门用…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

【unity小技巧】下载原神模型,在Blender中PMX模型转FBX模型,导入到Unity中实现基于光照模型的内置和URP卡通渲染

最终效果 前言 最近在研究人物模型的使用和卡通渲染效果&#xff0c;这里我们就使用原神的模型来演示。 一、原神模型下载 原神的模型可以在官网直接下载到。 1、第一期模型 官网&#xff1a;https://ys.biligame.com/gczj/ 2、第二期模型 官网&#xff1a;http://ys.bi…

Axure高端交互元件库:助力产品与设计

用户体验&#xff08;UX&#xff09;和用户界面&#xff08;UI&#xff09;设计对于任何产品的成功都至关重要。为了在这个竞争激烈的市场中脱颖而出&#xff0c;设计师和产品开发团队需要依赖强大的工具来创造引人注目且功能丰富的交互界面。下面介绍一款Axure精心制作的"…

背包问题的模板及各个等价变形

目录 0-1背包 —— 二维二重循环 01背包 —— 一维二重循环 完全背包 —— 二维三重循环 完全背包 —— 二维二重循环 完全背包 —— 一维二重循环 0-1背包 —— 二维二重循环 #include <bits/stdc.h> using namespace std; const int N 1010; int dp[N][N]; int v…

鸿蒙内核源码分析——(自旋锁篇)

本篇说清楚自旋锁 读本篇之前建议先读系列篇 进程/线程篇. 内核中哪些地方会用到自旋锁?看图: 概述 自旋锁顾名思义&#xff0c;是一把自动旋转的锁&#xff0c;这很像厕所里的锁&#xff0c;进入前标记是绿色可用的&#xff0c;进入格子间后&#xff0c;手一带&#xff0c…