写一个简单的MTK图片管理工具

前段时间曾经写了一篇介绍MTK的铃声管理的工具,可以把MP3,MID,WAV等声音转化为MTK可以使用的数组以供在编程中使用。后来针对有些朋友需要把数组再转为文件的需求,写了把数组重新写回文件的文章。但MTK的图片管理与铃声管理差异比较大。MTK的图片管理需要把图片信息提取出来以后,经过加工才能使用。MTK把图片数组前八个字节用来描述图片的信息,然后才是图片的内容DATA。所以要生成图片信息,还需要写入数组头。数组头包括图片类型,分为GIF,BMP,PNG,JPB,PBM等,每一种使用一个unsigned char的类型描述。图片的桢数,同样使用一个字节描述。然后是图片的大小,使用三个字节描述,最后两个字节描述图片的高和宽。然后是图片的数据BUFFER。代码如下。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <windows.h>

#define GDI_IMAGE_TYPE_INVALID 0
#define GDI_IMAGE_TYPE_BMP 1
#define GDI_IMAGE_TYPE_BMP_SEQUENCE 2
#define GDI_IMAGE_TYPE_GIF 3
#define GDI_IMAGE_TYPE_DEVICE_BITMAP 4
#define GDI_IMAGE_TYPE_DEVICE_BITMAP_SEQUENCE 5
#define GDI_IMAGE_TYPE_BMP_FILE 6
#define GDI_IMAGE_TYPE_GIF_FILE 7
#define GDI_IMAGE_TYPE_WBMP_FILE 8
#define GDI_IMAGE_TYPE_JPG 9
#define GDI_IMAGE_TYPE_JPG_FILE 10
#define GDI_IMAGE_TYPE_WBMP 11
#define GDI_IMAGE_TYPE_AVI 12
#define GDI_IMAGE_TYPE_AVI_FILE 13
#define GDI_IMAGE_TYPE_3GP 14
#define GDI_IMAGE_TYPE_3GP_FILE 15
#define GDI_IMAGE_TYPE_MP4 16
#define GDI_IMAGE_TYPE_MP4_FILE 17
#define GDI_IMAGE_TYPE_JPG_SEQUENCE 18
#define GDI_IMAGE_TYPE_PNG 19
#define GDI_IMAGE_TYPE_PNG_FILE 20
#define GDI_IMAGE_TYPE_PNG_SEQUENCE 21
#define GDI_IMAGE_TYPE_DEVICE_BMP_FILE 22
#define GDI_IMAGE_TYPE_BMP_FILE_OFFSET 23
#define GDI_IMAGE_TYPE_GIF_FILE_OFFSET 24
#define GDI_IMAGE_TYPE_M3D 25
#define GDI_IMAGE_TYPE_M3D_FILE 26
#define GDI_IMAGE_TYPE_SVG 27
#define GDI_IMAGE_TYPE_SVG_FILE 28
#define GDI_IMAGE_TYPE_SWFLASH 29
#define GDI_IMAGE_TYPE_SWFLASH_FILE 30

#define GDI_IMAGE_TYPE_JPG_FILE_OFFSET 31
#define GDI_IMAGE_TYPE_PNG_FILE_OFFSET 32
#define GDI_IMAGE_TYPE_DEVICE_BMP_FILE_OFFSET 33
#define GDI_IMAGE_TYPE_WBMP_FILE_OFFSET 34
#define GDI_IMAGE_TYPE_M3D_FILE_OFFSET 35
#define GDI_IMAGE_TYPE_SVG_FILE_OFFSET 36
#define GDI_IMAGE_TYPE_SWFLASH_FILE_OFFSET 37
#define GDI_IMAGE_TYPE_AVATAR 38

#define GDI_IMAGE_TYPE_ABM_FILE_OFFSET 39
#define GDI_IMAGE_TYPE_ABM 40
#define GDI_IMAGE_TYPE_ABM_SEQUENCE 41
#define GDI_IMAGE_TYPE_ABM_FILE 42

#define GDI_IMAGE_TYPE_MPG 43
#define GDI_IMAGE_TYPE_MPG_FILE 44
#define GDI_IMAGE_TYPE_MPG_FILE_OFFSET 45

#define GDI_IMAGE_TYPE_3G2 46
#define GDI_IMAGE_TYPE_3G2_FILE 47
#define GDI_IMAGE_TYPE_3G2_FILE_OFFSET 48

#define GDI_IMAGE_TYPE_VIS 49
#define GDI_IMAGE_TYPE_VIS_FILE 50

#define GDI_IMAGE_TYPE_BMP_MEM 51

#define GDI_IMAGE_TYPE_SUM 52


char * getfilename(char * filename)
{
char strResult[128]={0}; //保存结果
char *temp, *ret;
int i;

temp = filename;
int nStrLen = strlen(filename); //原始字符串长度

for(i = nStrLen - 1; i >= 0; i--) //倒查,每个字符和反斜杠对比
{
if (filename[i] == '//') //如果当前字符是反斜杠
{
break;
}
}
if(i == 0)
{
ret = temp;
}
else
{
ret = (temp+i+1);
}
return (ret);
}
char * getfileextname(char * filename)
{
char strResult[128]={0}; //保存结果
char *temp, *ret;
int i;

temp = filename;
int nStrLen = strlen(filename); //原始字符串长度

for(i = nStrLen - 1; i >= 0; i--) //倒查,每个字符和反斜杠对比
{
if (filename[i] == '.') //如果当前字符是反斜杠
{
ret = (temp+i+1);
break;
}
}

return (ret);
}
BOOL isImageFile(char * filename)
{
if (memcmp(filename, "null", 4)==0)
{
return false;
}
if ((memcmp(getfileextname(filename), "png", 3) == 0) ||
(memcmp(getfileextname(filename), "gif", 3) == 0) ||
(memcmp(getfileextname(filename), "pbm", 3) == 0)||
(memcmp(getfileextname(filename), "jpg", 3) == 0)||
(memcmp(getfileextname(filename), "bmp", 3) == 0)
)
{
return true;
}
else
{
return false;
}
}

char * modifystr(char * str)
{
char *tmp;
int i;

tmp = str;
for (i = 0; i < (int)strlen(str)-1; i++)
{
if ((str[i] == ' ') || (str[i] == '.'))
{
*(tmp+i) = '_';
}
}

return tmp;
}
unsigned char * imagewritehead(unsigned char * head, unsigned char img_type, int img_size, int frame_number, int width, int height)
{

head[0] = img_type;
head[1] = frame_number; //frame_number;
head[2] = img_size&0xff;
head[3] = (img_size>>8)&0xff;
head[4] = (img_size>>16)&0xff;
head[5] = height&0xff;
head[6] = ((height>>8)&0x0f)|((width&0x0f)<<4);
head[7] = (width>>4);

return head;
}
//BMP
BITMAPFILEHEADER file_head;
BITMAPINFO fileinfo;
int image2res(char * image, char * res)
{
long infileLen; //文件长度
int n=0,num=1; //n 字节计数器, NUM换行指示
unsigned char c, c_in; //C_in文件字节,C转化
FILE *fh_in;
FILE *fh_out;
char com[256]={0};
char filename[256]={0};

unsigned char filehead[8];
char fileheads[50];


assert((image != NULL) && (res != NULL));

fh_in = fopen(image,"rb");
if (NULL==fh_in)
{
printf("open read file error!!");
return 1;
}

fseek(fh_in,0,SEEK_END);
infileLen=ftell(fh_in);
fseek(fh_in,0,SEEK_SET);
/*读取BMP文件头*/
if (sizeof(file_head)!=fread(&file_head,1,sizeof(file_head),fh_in))
{
printf("read bmp file error!!");
fclose(fh_in);
return 1;
}
/*读取BMP文件信息*/
if (sizeof(fileinfo)!=fread(&fileinfo,1,sizeof(fileinfo),fh_in))
{
printf("read bmp file error!!");
fclose(fh_in);
return 1;
}
fseek(fh_in,0,SEEK_SET);
imagewritehead(filehead, 1, infileLen, 1, fileinfo.bmiHeader.biWidth, fileinfo.bmiHeader.biHeight);

fh_out=fopen(res,"ab");
if (NULL==fh_out)
{
printf("open write file error!!");
return 1;
}
/*写入注释*/
memcpy(filename, getfilename(image), 256);

sprintf(com, "/*The image is : %s, size is: %ld byte */", filename, infileLen);
fputs(com, fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);
memset(com, 0x00, 128);

modifystr(filename);
sprintf(com, "__align(4) const U8 %s[] = {", filename);
fputs(com, fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);

//生成数组的前八个字节
sprintf(fileheads, "0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X,/0", filehead[0],filehead[1],filehead[2],filehead[3],filehead[4],filehead[5],filehead[6],filehead[7]);

//把文件信息写入前八个字节
fputs(fileheads, fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);
/*写入数据*/
while (n<(infileLen))
{
putc('0',fh_out);
putc('x',fh_out);
c_in=getc(fh_in);
c=c_in;

c=(c>>4)&0x0f; //获取高四个BIT的内容
if (c<0x0a)
{
c+=0x30; //把符号转成数字
}
else
{
c+=0x37; //转成a到f
}
putc(c,fh_out);
c=c_in&0x0f; //获取低四个BIT内容
if (c<0x0a)
{
c+=0x30;
}
else
{
c+=0x37;
}
putc(c,fh_out);
putc(',',fh_out);
putc(' ',fh_out);
n++;

if (num++ % 16 ==0)
{
putc(0x0d,fh_out);
putc('/n',fh_out);
}


}
putc('}',fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);

//memset(com, 0x00, 128);
//sprintf(com, "{%s, sizeof(%s), %d}", filename, filename, getfilevalue(getfileextname(image)));
//fputs(com, fh_out);
putc(0x0d,fh_out);
putc('/n',fh_out);

fclose(fh_in);
fclose(fh_out);
return 0;
}
int main(int argc, char* argv[])
{
WIN32_FIND_DATA fd;
HANDLE hd;

hd=::FindFirstFile((LPCTSTR)"*.*",&fd); //开始查找

if(hd==INVALID_HANDLE_VALUE)
{
if (!isImageFile(fd.cFileName))
printf("没有找到文件");
return 0;
}

if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
{
if (isImageFile(fd.cFileName))
{
image2res(fd.cFileName, (char *)"custimgdatahw.h");
}
}
while(FindNextFile(hd,&fd)) //继续查找
{
if(!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY))
{
if (isImageFile(fd.cFileName))
{
image2res(fd.cFileName, (char *)"custimgdatahw.h");
}
}
}
FindClose(hd);//关闭查找
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值