8位灰度纵向取模数据转16位真彩色水平扫描取模数据

 需要将上图软件取模数据,转换成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,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值