⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tft_imgcontrol.c

📁 GPRS模组资料包含DEMO
💻 C
字号:
#include "TFT_ImgControl.h"
#include "BitMap.h"
#include "JPEG.h"
// 用户解码函数声明
static int TFT_CheckIfBitMap(void *SrcImage);
static int TFT_DepressBitMap(STR_IMAGE *DestImage, void *SrcBitMap);
static int TFT_CheckIfJPEG(void *SrcImage);
static int TFT_DepressJPEG(STR_IMAGE *DestImage, void *SrcJPEG);

// 解码函数列表, 如需增加对图像文件的支持, 只需在这里注册文件类型判断和文件解码函数
static STR_DEPRESS_FUNC_LIST DepressFuncList[] = {
	{TFT_CheckIfBitMap, TFT_DepressBitMap},
	{TFT_CheckIfJPEG, TFT_DepressJPEG},
};

//=============================================================
//语法格式:	int TFT_DepressImage(STR_IMAGE *DestImage, void *SrcImage)
//实现功能:	解压图像
//参数:		DestImage	-	解压之后的位图
//				SrcJPEG		-	原始图像文件
//返回值:		1: 解压成功;  0: 解压失败
//=============================================================
int TFT_DepressImage(STR_IMAGE *DestImage, void *SrcImage)
{
	int i = sizeof(DepressFuncList) / sizeof(STR_DEPRESS_FUNC_LIST);
	while(i--)
	{
		if(DepressFuncList[i].CheckImageType(SrcImage))
			return (DepressFuncList[i].DepressImage(DestImage, SrcImage));
	}
	return 0;
}

//=============================================================
//语法格式:	void TFT_ScaleLine(int width1, int width2, COLOR srcLine[], COLOR destLine[], int Reverse)
//实现功能:	缩放行
//参数:		width1	-	行原始宽度
//				width2	-	缩放后的宽度
//				srcLine	-	原始行图像保存位置
//				destLine-	缩放后行图像保存位置
//				Reverse	-	是否水平翻转
//返回值:		无
//=============================================================
void TFT_ScaleLine(int width1, int width2, COLOR srcLine[], COLOR destLine[], int Reverse)
{
	int RowDest;
	int RowSrc = 0;
	int RowCount = 0;
	int RowStart, RowEnd, RowStep;
 	if(Reverse)
	{
		RowStart = width2 - 1;
		RowEnd = -1;
		RowStep = -1;
	}
	else
	{
		RowStart = 0;
		RowEnd = width2;
		RowStep = 1;
	}
	for(RowDest = RowStart; RowDest != RowEnd; RowDest += RowStep)
	{
		destLine[RowDest] = srcLine[RowSrc];
		RowCount += width1;
		while(RowCount >= width2)
		{
			RowCount -= width2;
			RowSrc++;
		}
	}
}

//=============================================================
//语法格式:	void TFT_ScaleImage(int width1, int height1, int width2, int height2, COLOR srcImage[], COLOR destImage[], int HorRvs, int VerRvs)
//实现功能:	缩放图像
//参数:		width1, height1	-	图像原始尺寸
//				width2, height2 -	缩放后的尺寸
//				srcImage		-	原始图像保存位置
//				destImage		-	缩放后图像保存位置
//				HorRvs			-	是否进行水平翻转
//				VerRvs			-	是否进行垂直翻转
//返回值:		无
//=============================================================
void TFT_ScaleImage(int width1, int height1, int width2, int height2, COLOR srcImage[], COLOR destImage[], int HorRvs, int VerRvs)
{
	int LineDest , LineSrc = 0;
	int LineCount = 0;
	int LineStart, LineEnd, LineStep;
	if(VerRvs)
	{
		LineStart = height2 - 1;
		LineEnd = -1;
		LineStep = -1;
	}
	else
	{
		LineStart = 0;
		LineEnd = height2;
		LineStep = 1;
	}

    for(LineDest = LineStart; LineDest != LineEnd; LineDest += LineStep)
    {
    	TFT_ScaleLine(width1, width2, &srcImage[LineSrc * width1], &destImage[LineDest * width2], HorRvs);
        LineCount += height1;
        while(LineCount >= height2)
        {
            LineCount -= height2;
            LineSrc++;
        }
    }
}

//=============================================================
//语法格式:	int TFT_CheckIfBitMap(void *SrcImage)
//实现功能:	判断是否是BMP文件
//参数:		SrcImage	-	文件首地址
//返回值:		1: 是;  0: 否
//=============================================================
static int TFT_CheckIfBitMap(void *SrcImage)
{
	char *pBuf = SrcImage;
	if((pBuf[0] == 'B') && (pBuf[1] == 'M'))
		return 1;
	return 0;
}

//=============================================================
//语法格式:	int TFT_DepressBitMap(STR_IMAGE *DestImage, void *SrcBitMap)
//实现功能:	解压位图
//参数:		DestImage	-	解压之后的位图
//				SrcBitMap	-	BMP位图文件
//返回值:		1: 解压成功;  0: 解压失败
//=============================================================
static int TFT_DepressBitMap(STR_IMAGE *DestImage, void *SrcBitMap)
{
	BITMAP_FILE bmp;
	int i;
	COLOR *pBuf = (COLOR *)DestImage->ImageBuf;

	if(BMP_OpenFile(&bmp, SrcBitMap) != 0)
		return 0;

	DestImage->Width = BMP_GetWidth(&bmp);
	DestImage->Height = BMP_GetHeight(&bmp);

	for(i = 0; i < DestImage->Height; i++)
	{
		if(BMP_GetLineColor(&bmp, i, pBuf) == 0)
			return 0;
		pBuf += DestImage->Width;
	}
	return 1;
}

//=============================================================
//语法格式:	int TFT_CheckIfJPEG(void *SrcImage)
//实现功能:	判断是否是JPEG文件
//参数:		SrcImage	-	文件首地址
//返回值:		1: 是;  0: 否
//=============================================================
static int TFT_CheckIfJPEG(void *SrcImage)
{
	unsigned char *pBuf = SrcImage;
	int i = 1024;
	while(i--)
	{
		if(*pBuf++ == 0xff)
		if(*pBuf++ == 0xd8)
		{
			while(i--)
			{
				if(*pBuf++ == 'J')
				if(*pBuf++ == 'F')
				if(*pBuf++ == 'I')
				if(*pBuf++ == 'F')
					return 1;
			}
		}
	}
	return 0;
}

//=============================================================
//语法格式:	int TFT_DepressJPEG(STR_IMAGE *DestImage, void *SrcJPEG)
//实现功能:	解压JPEG图像
//参数:		DestImage	-	解压之后的位图
//				SrcJPEG		-	JPEG文件
//返回值:		1: 解压成功;  0: 解压失败
//=============================================================
static int TFT_DepressJPEG(STR_IMAGE *DestImage, void *SrcJPEG)
{
	if(JPEG_GetPictureSize(SrcJPEG, &DestImage->Width, &DestImage->Height) == 0)
		return 0;
	return (JPEG_DepressPicture(SrcJPEG, DestImage->ImageBuf));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -