需要将上图软件取模数据,转换成ImageLcd取模数据,用于TFT彩屏显示
下面是一个全部转换返回的demo
/********************************************************************
函数功能:将8位灰度图纵向取模数据转16位真彩水平扫描取模数据
输入参数: uiWidth 灰度图宽度 像素
uiHeight 灰度图高度 像素
pucGrayBitmap 灰度图数据
输出参数: pucColorBitmap 16位真彩数据
返 回 值: 无
备注:此函数将数据完全转换后返回,若灰度图数据量过大,对于堆栈的开销极大
*******************************************************************/
void ConvertGraytoColor(u32 uiWidth, u32 uiHeight, u8* pucGrayBitmap, u8* pucColorBitmap)
{
u32 i, j, k;
u8 ucBitMask[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
u16 unColor = 0;
for(i = 0; i < uiWidth; i++)
{
for(j = 0; j < uiHeight/8; j++)
{
for(k = 0; k < 8; k++)
{
if (pucGrayBitmap[j * uiWidth + i] & ucBitMask[k])
{
unColor = 0x0000;
}
else
{
unColor = 0xFFFF;
}
pucColorBitmap[2 *(i + uiWidth * (j * 8 + k))] = unColor >> 8 & 0xFF;
pucColorBitmap[2 *(i + uiWidth * (j * 8 + k)) + 1] = unColor & 0xFF;
}
}
if (uiHeight % 8)
{
for(k = 0; k < uiHeight % 8; k++)
{
if (pucGrayBitmap[j * uiWidth + i] & ucBitMask[k])
{
unColor = 0x0000;
}
else
{
unColor = 0xFFFF;
}
pucColorBitmap[2 *(i + uiWidth * (j * 8 + k))] = unColor >> 8 & 0xFF;
pucColorBitmap[2 *(i + uiWidth * (j * 8 + k)) + 1] = unColor & 0xFF;
}
}
}
}
为减小堆栈开销,于是优化了一下,搞了个单行转换并显示,又根据应用那边放大的需求,加入宽高倍数控制
/*******************************************************************************
函数功能: 8位灰度图纵向取模数据 转 16位真彩色水平扫描取模数据 并显示
输入参数: uiXS 显示的开始x 单位:像素点
uiYS 显示的开始y 单位:像素点
uiWidth 8位灰度图的宽 单位:像素点
uiHeight 8位灰度图的高 单位:像素点
pucBitmap 需要转换的8位灰度图取模数据
ucScaleX 宽放大倍数
ucScaleY 高放大倍数
输出参数: 无
返回值 : SDK_OK 成功
SDK_ERROR 失败
SDK_PARAMERR 参数错误
--------------------------------------------------------------------------------
备注 : 单行转换并根据倍数立即显示,此函数用于16位真彩色取模数据过大,节省内存
--------------------------------------------------------------------------------
*******************************************************************************/
s32 devLcdGrayConvertColor(u32 uiXS,u32 uiYS, u32 uiWidth, u32 uiHeight, u8* pucGrayBitmap,u8 ucScaleX,u8 ucScaleY)
{
u16 unColor = 0; //颜色
u32 i = 0, j = 0, k = 0, m = 0, n = 0;
u32 uiTestH = 0; //控制显示第n行
u8 ucLineColorBuf[640] = {0}; //转换的一行16位真彩取模数据
u8 ucBitMask[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //颜色控制,8位灰度数据,1bit = 1像素
if(pucGrayBitmap == NULL || ucScaleX == 0 || ucScaleY == 0
||uiXS + uiWidth * ucScaleX > 319 || uiYS + uiHeight * ucScaleY > 239)
{
return SDK_PARAMERR;
}
for(j = 0; j < uiHeight/8; j++) // 完整8行个数
{
for(k = 0; k < 8; k++) // 循环8行
{
for(i = 0; i < uiWidth; i++) // 单行
{
if (pucGrayBitmap[j * uiWidth + i] & ucBitMask[k]) //颜色控制
{
unColor = 0x0000; //黑色
}
else
{
unColor = 0xFFFF; //白色
}
for (m = 0; m < ucScaleX; m++)
{
//根据倍数拷贝水平方向几个像素
memcpy(ucLineColorBuf + 2*i*ucScaleX+2*m, &unColor, 2);
}
}
for (n = 0; n < ucScaleY; n++)
{
//根据倍数控制显示行数
sdkLcdDispBitmap(uiXS, uiYS + j*8*ucScaleY + uiTestH+n, ucLineColorBuf, ucScaleX*uiWidth, 1);
}
uiTestH += ucScaleY; //行数循环倍数
memset(ucLineColorBuf, 0xFF, sizeof(ucLineColorBuf)); //行数据清成白色
}
uiTestH = 0; //下一组8行,控制行显示重新开始
}
uiTestH = 0;
if (uiHeight % 8)
{
//剩余非8倍行数,剩下几行 取 ucBitMask前几位
for(k = 0; k < uiHeight % 8; k++)
{
for(i = 0; i < uiWidth; i++) // 单行
{
if (pucGrayBitmap[j * uiWidth + i] & ucBitMask[k])
{
unColor = 0x0000;
}
else
{
unColor = 0xFFFF;
}
for (m = 0; m < ucScaleX; m++)
{
//根据倍数拷贝水平方向几个像素
memcpy(ucLineColorBuf + 2*i*ucScaleX+2*m, &unColor, 2);
}
}
for (n = 0; n < ucScaleY; n++)
{
//根据倍数控制显示行数
sdkLcdDispBitmap(uiXS, uiYS + j*8*ucScaleY + uiTestH+n, ucLineColorBuf, ucScaleX*uiWidth, 1);
}
uiTestH += ucScaleY; //行数循环倍数
memset(ucLineColorBuf, 0xFF, sizeof(ucLineColorBuf));
}
}
return SDK_OK;
}
unsigned char Bmp037[]=
{
/*------------------------------------------------------------------------------
; 若数据乱码,请检查字模格式设置,注意选择正确的取模方向和字节位顺序。
; 源文件 / 文字 : D:\03_工具\ZIMO3破解\Zimo3Pro\hand.bmp字模
; 宽×高(像素): 24×16
; 字模格式/大小 : 单色点阵液晶字模,纵向取模,字节正序/48字节
; 数据转换日期 : 2023/9/9 9:09:16
------------------------------------------------------------------------------*/
//0x18,0x10,0x03,//宽的像素数,高的像素数,宽的字节数,参数设置可选
0x07,0x0F,0x0F,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x90,0x90,0xB0,0xD2,0x12,
0x12,0x12,0x13,0x12,0x12,0x12,0x0C,0x00,0xF0,0xF8,0xF8,0x08,0x08,0x08,0x04,0x04,
0x02,0x02,0x01,0x01,0x01,0x09,0x49,0x49,0x46,0x30,0x80,0x00,0x00,0x00,0x00,0x00,
};
void main()
{
u8 buf[24*16*2] = {0};
memset(buf, 0xFF, sizeof(buf));
devLcdGrayConvertColor(100, 100, 24, 16, (u8*)Bmp037, 4, 4);
ConvertGraytoColor(24, 16, (u8*)Bmp037, (u8*)buf);
sdkLcdDispBitmap(100, 100, (u8*)buf, 24, 16);
}
显示
LcdCmd(0x2a); // 命令
LcdDat(unX>>8); // 数据
LcdDat(unX&0xff);
LcdDat(unEx>>8);
LcdDat(unEx&0xff); //开始与结束X
LcdCmd(0x2b);
LcdDat(unY>>8);
LcdDat(unY&0xff);
LcdDat(unEy>>8);
LcdDat(unEy&0xff); //开始与结束y
LcdCmd(0x2c);
LcdCsLow();
LcdSetDcStatus(1); //数据脚状态
LcdSpiDmaSend(pucData, uiDataLen);
LcdCsHigh();
8位灰度图数据,首字节0x07 = 00000111为例,1个字节8个像素,纵向取模,第一列1-5行为白色,第一列6-8为黑色;第二个字节0x0F = 00001111,第二列1-4行为白色,第二列5-8为黑色。
16位真彩色数据,两个字节1个像素,水平扫描,图12-15为黑色,对赢第24字节开始,8个0x00,