写一个简单的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;
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blogercn/archive/2009/08/23/4475981.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 小米MTK手机是指使用联发科技(MTK)处理器的小米手机。为了在刷机或者解锁手机时使用,很多人会想要入手机的串号(即IMEI号)。那么,小米MTK手机串号应该使用哪个工具呢? 一种常见的工具是Miracle Box。Miracle Box是一款多功能的修复工具,能够处理MTK芯片手机的串号问题。用户只需要将手机通过USB接口连接到电脑,然后使用Miracle Box软件的号功能(在Miracle Box主界面依次选择MTK、IMEI&HDD、Writeimei),即可对手机的串号进行修改。 除此之外,SP Flash Tool也是一个常用的MTK手机刷机工具,也支持IMEI号的功能。不过在使用SP Flash Tool时需要手动输入指令,操作起来相对来说比较复杂。 综上所述,小米MTK手机串号可以使用Miracle Box或者SP Flash Tool这两个软件。不过对于非专业人士而言,Miracle Box更加简单易用,因此较为推荐。此外,无论是哪个软件,操作前都需要备份好手机的重要数据以避免意外情况。 ### 回答2: 小米手机MTK芯片的串号,通常可以使用MTK工具入。其中比较常用的工具有SP Flash Tool和SN Writer两种。这两种工具都能够实现MTK芯片的串号入。 其中,SP Flash Tool是一款比较常用的MTK芯片刷机工具,可以用于刷机、重置参数等操作,同时也支持串号的入。使用该工具时需要先安装驱动程序,并将手机连接至计算机,然后选择相应的刷机文件进行操作。 SN Writer是一款集成了串号入功能的工具,可以一次性入多个手机的IMEI、WiFi、BT和AT等信息。使用该工具时也需要安装驱动程序,并将手机连接至计算机,然后输入相应的串号信息进行入。 总结来说,小米MTK芯片的串号入,可以通过SP Flash Tool和SN Writer等工具来实现。具体使用时需要注意安装驱动并按照操作步骤进行。 ### 回答3: 小米MTK串号需要使用SP Flash Tool这款工具。SP Flash Tool是一款针对MTK芯片手机的刷机工具,功能强大,支持入、备份和恢复串号等操作。 具体操作步骤如下: 1. 下载并安装SP Flash Tool工具。 2. 打开工具,点击"Download Agent"选项,选择对应的MTK芯片型号的配置文件。 3. 点击"Scatter-loading"选项,选择对应的MTK芯片型号的scatter文件。 4. 勾选"Barcode"选项,输入需要入的串号。 5. 点击"Download"按钮,连接手机至电脑,并确保手机处于关机状态。 6. 电脑将自动识别连接的手机,开始入串号。 7. 入完成后,断开手机连接并重新开机,即可完成串号修改。 需要注意的是,在进行MTK串号操作时,一定要谨慎操作,避免出现不可逆的问题。建议在操作前提前备份好手机的原有串号,以便出现问题时进行恢复。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值