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

📄 imagegetdimension.cpp

📁 在MTK平台上开放的一个皮肤工具,可以支持jpg、bmp、png图片
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include "mmi.h"


/* header info size */
#define BMP_INFO_SIZE	26
#define GIF_INFO_SIZE	10
#define PNG_INFO_SIZE	24

/* markers of JPEG standard */
#define JPEG_MARKER_SOF0	0xC0
#define JPEG_MARKER_SOF1	0xC1
#define JPEG_MARKER_SOF2	0xC2
#define JPEG_MARKER_SOF3	0xC3
#define JPEG_MARKER_SOF15	0xCF
#define JPEG_MARKER_SOS		0xDA
#define JPEG_MARKER_DQT		0xDB
#define JPEG_MARKER_DNL		0xDC
#define JPEG_MARKER_DRI		0xDD
#define JPEG_MARKER_DHP		0xDE
#define JPEG_MARKER_EXP		0xDF
#define JPEG_MARKER_COM		0xFE
#define JPEG_MARKER_APP0	0xE0
#define JPEG_MARKER_APP15	0xEF

/* macros to get data (X) from buffer (SRC) */
#define GET_U8(SRC,X)           \
	do                          \
	{                           \
		X = ((U8) *(SRC)++);    \
	} while(0)

#define GET_U16(SRC,X)              \
	do                              \
	{                               \
		X = ((U16) (U8)*(SRC)++);   \
		X |= ((U16) *(SRC)++)<<8;   \
	} while(0)

#define GET_U24(SRC,X)                  \
	do                                  \
	{                                   \
		X = ((U32) (U8)*(SRC)++);       \
		X |= ((U32) (U8)*(SRC)++)<<8;   \
		X |= ((U32) (U8)*(SRC)++)<<16;  \
	} while(0)

#define GET_U32(SRC,X)                  \
	do                                  \
	{                                   \
		(X) = ((U32) (U8)*(SRC)++);     \
		(X) |= ((U32) (U8)*(SRC)++)<<8; \
		(X) |= ((U32) (U8)*(SRC)++)<<16;\
		(X) |= ((U32) (U8)*(SRC)++)<<24;\
	} while(0)

#define PEEK_U8(SRC,X)      \
	do                      \
	{                       \
        (X) = (U8) *(SRC);  \
	} while(0)

#define PEEK_U8_N(SRC,X,N)      \
	do                          \
	{                           \
        (X) = (U8) *(SRC + N);  \
	} while(0)

#define FLUSH(SRC,X)    \
	do                  \
	{                   \
		(SRC) += (X);   \
	} while(0)

#define MYFCLOSE(fp)    \
    do                  \
    {                   \
        if (fp != NULL) \
        {               \
            fclose(fp); \
            fp = NULL;  \
        }               \
    } while(0)

#define GDI_GIF_STACK_SIZE  (0x1000 + 4)
#define GDI_GIF_TREE_SIZE   (0x4000 + 4)

#define STR_SIZE    256

typedef enum
{
    ENFB_IMAGE_NONE,    /* Cannot be changed to list,matrix,circular */
    ENFB_IMAGE_ASSOCIATE,
    ENFB_IMAGE_VIDEO,
    ENFB_IMAGE_DIMENSION,
    ENFB_IMAGE_TOTAL
} MMI_ENFB_IMAGE_ENUM;

/*****************************************************************************
 * FUNCTION
 *  image_bmp_get_dimension
 * DESCRIPTION
 *  get dimension of a bmp from file
 * PARAMETERS
 *  filename    [IN]
 *  width       [OUT]
 *  height      [OUT]
 * RETURNS
 *  MMI_BOOL	MMI_TRUE or MMI_FALSE
 *****************************************************************************/
static MMI_BOOL image_bmp_get_dimension(char *filename, U32 *width, U32 *height)
{
  /*----------------------------------------------------------------*/
  /* Local Variables                                                */
  /*----------------------------------------------------------------*/
  FILE *fp;
  U8 buf[BMP_INFO_SIZE];
  U8 *src;
  U16 bfType;
  U32 bfSize;
  U32 biWidth;
  U32 biHeight;
  U32 biSize;

  fp = fopen((char *)filename, "rb");
	if (fp == NULL)
	{
    fprintf(stderr, "Open file error:\t%s\n", filename);
    fprintf(stderr, "\t%s\n", strerror(errno));
		return MMI_FALSE;
	}
	if (fread(buf, sizeof(char), BMP_INFO_SIZE, fp) != BMP_INFO_SIZE)
	{
		fprintf(stderr, "Read file error:\t%s\n", filename);
    MYFCLOSE(fp);
		return MMI_FALSE;
	}
	src = buf;
  MYFCLOSE(fp);

	/* read file header */
	GET_U16(src, bfType);
	GET_U32(src, bfSize);
	FLUSH(src, 8);

	/* read info header */
  GET_U32(src, biSize);
	if (biSize == 12)
	{
		GET_U16(src, biWidth);
		GET_U16(src, biHeight);
	}
	else
	{
		GET_U32(src, biWidth);
		GET_U32(src, biHeight);
	}

	*width = biWidth;
	*height = biHeight;

	/* test if it is BMP file */
	if (bfType != 0x4d42)	/* BM */
	{
		fprintf(stderr, "Non-standard file error:\t%s\n", filename);
		return MMI_FALSE;
	}
	/* core info header, currently not support */
	if (bfSize == BMP_INFO_SIZE)
	{
		fprintf(stderr, "Non-standard file error:\t%s\n", filename);
		return MMI_FALSE;
	}

    return MMI_TRUE;
}


/*****************************************************************************
 * FUNCTION
 *  image_gif_get_dimension
 * DESCRIPTION
 *  get dimension of a gif from file
 * PARAMETERS
 *  filename    [IN]
 *  width       [OUT]
 *  height      [OUT]
 * RETURNS
 *  MMI_BOOL	MMI_TRUE or MMI_FALSE
 *****************************************************************************/
static MMI_BOOL image_gif_get_dimension(char *filename, U32 *width, U32 *height)
{
  /*----------------------------------------------------------------*/
  /* Local Variables                                                */
  /*----------------------------------------------------------------*/
  FILE *fp;
  U8 buf[GIF_INFO_SIZE];
  U8 *src;
  U32 header;

  fp = fopen((char *)filename, "rb");
	if (fp == NULL)
	{
		fprintf(stderr, "Open file error:\t%s\n", filename);
		return MMI_FALSE;
	}
  
	if (fread(buf, sizeof(char), GIF_INFO_SIZE, fp) != GIF_INFO_SIZE)
	{
		fprintf(stderr, "Read file error:\t%s\n", filename);
    MYFCLOSE(fp);
		return MMI_FALSE;
	}
	src = buf;
  MYFCLOSE(fp);

  /* test if it is BMP file */
  GET_U24(src, header);
  if (header != 0x464947) /* 'GIF' */
  {
    *width = 0;
    *height = 0;
    return MMI_FALSE;
  }
  
  /* read GIF dimention */
  FLUSH(src, 3);
  GET_U16(src, *width);
  GET_U16(src, *height);

  return MMI_TRUE;
}


/*****************************************************************************
 * FUNCTION
 *  image_gif_get_frame_count
 * DESCRIPTION
 *  get frame count of a gif from file
 * PARAMETERS
 *  filename    [IN]
 *  framecount  [OUT]
 * RETURNS
 *  MMI_BOOL	MMI_TRUE or MMI_FALSE
 *****************************************************************************/
static MMI_BOOL image_gif_get_frame_count(char *filename, U32 *framecount)
{
  FILE *fp;
  U8 *buf, *src;
  U32 file_size;

  fp = fopen((char *)filename, "rb");
	if (fp == NULL)
	{
		fprintf(stderr, "Open file error:\t%s\n", filename);
        fprintf(stderr, "\t%s\n", strerror(errno));
		return MMI_FALSE;
	}

  fseek(fp, 0, SEEK_END);
  file_size = (U32)ftell(fp);
  fseek(fp, 0, SEEK_SET);
  
  buf = (U8*)malloc(file_size*sizeof(U8));
  if (buf == NULL)
  {
	  fprintf(stderr, "Memory allocation failed:\t%s\n", filename);
    MYFCLOSE(fp);
	  return MMI_FALSE;
  }
  if (fread(buf, sizeof(char), file_size, fp) != file_size)
  {
	  fprintf(stderr, "Read file error:\t%s\n", filename);
    MYFCLOSE(fp);
	  return MMI_FALSE;
  }
  src = buf;
  MYFCLOSE(fp);

  /* init the return frame_count value */
  *framecount = 0;
    
  /* read the GIF file signature */
  {
      U8 sig[3];

      GET_U8(src, sig[0]);
      GET_U8(src, sig[1]);
      GET_U8(src, sig[2]);

      if (sig[0] != 'G' || sig[1] != 'I' || sig[2] != 'F')
      {
          return MMI_FALSE;
      }
  }

  /* skip dimension value */
  {
      S16 img_w, img_h;

      FLUSH(src, 3);
      GET_U16(src, img_w);
      GET_U16(src, img_h);
      if(img_w < 0 || img_h < 0 || img_w >= 10240 || img_h >= 10240)
      {
          return MMI_FALSE;
      }
  }

  /* read the global color palette */
  {
      S32 palette_count;
      
      GET_U8(src, palette_count);
      FLUSH(src, 2);


      if (palette_count & 0x80)
      {
          palette_count = 1 << ((palette_count & 0x7) + 1);
          FLUSH(src, (palette_count * 3));
      }
  }

  /* start decoding */
  do
  {
      U8 symbol;

      GET_U8(src, symbol);
      switch(symbol)
      {
          /* Process the GIF extension block */
          case '!':
              {
                  U8 ext;

                  GET_U8(src, ext);
                  
                  if (ext == 0xf9)
                  {
                      FLUSH(src, 6);
                  }
                  else
                  {
                      U8 boffset;
                      S32 offset;

                      while (1)
                      {
                          GET_U8(src, boffset);
                          offset = (S32)boffset;
                          if (offset == 0)
                          {
                              break;
                          }
                          FLUSH(src, offset);
                      }
                  }
              }
              break;
              
          case ',':
              /* gdi_image_gif_dummy_decoder(); */
              {
                  S32 want_pixels;
                  S32 bitstream_available_bits, bytestream_available;
                  S32 GDI_TREE_BUFFER[GDI_GIF_TREE_SIZE / sizeof(S32)];
                  U32 bitstream;
                  S16 GIF_current_code_size, GIF_clear_code, GIF_end_code, GIF_new_codes, GIF_top_slot, GIF_slot;
                  S16 size, c, oc, fc, code;
                  S16 *stack_pointer;
                  S16 GIF_mtk_stack[GDI_GIF_STACK_SIZE / sizeof(S16)];
                  S16 *GIF_mtk_suffix = (S16 *) GDI_TREE_BUFFER;
                  S16 *GIF_mtk_prefix = (S16 *) (((U8 *) GDI_TREE_BUFFER) + sizeof(GDI_TREE_BUFFER) / 2);
                  U16 temp;
                  U8 finished_decoding = 0;

                  {
                      S32 x, y, xsize, ysize;

                      GET_U16(src, temp);     x = (S32)temp;
                      GET_U16(src, temp);     y = (S32)temp;
                      GET_U16(src, temp);     xsize = (S32)temp;
                      GET_U16(src, temp);     ysize = (S32)temp;
                      
                      want_pixels = xsize * ysize;
                  }

                  {
                      S32 n;

                      GET_U8(src, n);

                      if (src >= buf + file_size)
                      {
                          return MMI_FALSE;
                      }

                      if (n & 0x80)
                      {
                          n = 1 << ((n & 0x7) + 1);

                          /* skip reading palette */
                          FLUSH(src, n * 3);
                      }
                  }

⌨️ 快捷键说明

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