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

📄 imagegetdimension.cpp

📁 在MTK平台上开放的一个皮肤工具,可以支持jpg、bmp、png图片
💻 CPP
📖 第 1 页 / 共 2 页
字号:
                  GET_U8(src, temp);  size = (S16)temp;

                  /* GIF_INITIALIZE_DECODER(size);*/
                  GIF_current_code_size = (S16)(size + 1);
                  GIF_top_slot = (S16)(1 << GIF_current_code_size);
                  GIF_clear_code = (S16)(1 << size);
                  GIF_end_code = (S16)(GIF_clear_code + 1);
                  GIF_slot = (GIF_new_codes) = (S16)(GIF_end_code + 1);
                  bitstream_available_bits = 0;
                  bytestream_available = 0;
                  bitstream = 0;

                  oc = fc = 0;
                  stack_pointer = GIF_mtk_stack;

                  /* begin decoding */
                  while (!finished_decoding)
                  {
                      /* GIF_GET_NEXT_CODE(c); */
                      while(GIF_current_code_size > bitstream_available_bits)
                      {
                          if(bytestream_available == 0)
                          {
                              GET_U8(src, temp);  bytestream_available = (S32)temp;
                          }
                          GET_U8(src, temp);
                          bitstream |= temp << bitstream_available_bits;
                          bitstream_available_bits +=8;
                          bytestream_available--;
                      }
                      bitstream_available_bits -= GIF_current_code_size;
                      c = (S16) bitstream & ((1 << GIF_current_code_size) - 1);
                      bitstream >>= GIF_current_code_size;

                      if (c == GIF_end_code)
                      {
                          break;
                      }

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

                      if (c == GIF_clear_code)
                      {
                          GIF_current_code_size = (S16) (size + 1);
                          GIF_slot = GIF_new_codes;
                          GIF_top_slot = (S16) (1 << GIF_current_code_size);

                          /* GIF_GET_NEXT_CODE(c); */
                          while(GIF_current_code_size > bitstream_available_bits)
                          {
                              if(bytestream_available == 0)
                              {
                                  GET_U8(src, temp);  bytestream_available = (S32)temp;
                              }
                              GET_U8(src, temp);
                              bitstream |= temp << bitstream_available_bits;
                              bitstream_available_bits +=8;
                              bytestream_available--;
                          }
                          bitstream_available_bits -= GIF_current_code_size;
                          c = (S16) bitstream & ((1 << GIF_current_code_size) - 1);
                          bitstream >>= GIF_current_code_size;

                          if (c == GIF_end_code)
                          {
                              break;
                          }

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

                          if (c >= GIF_slot)
                          {
                              c = 0;
                          }

                          oc = fc = c;
                          if ((--want_pixels) < 0)
                          {
                              finished_decoding = 1;
                          }
                      }
                      else
                      {
                          code = c;
                          if (code >= GIF_slot)
                          {
                              code = oc;
                              *stack_pointer++ = fc;
                          }

                          while (code >= GIF_new_codes)
                          {
                              if(stack_pointer >= (S16*)(((U8*)GIF_mtk_stack) + sizeof(GIF_mtk_stack)))
                              {
                                  return MMI_FALSE;
                              }

                              *stack_pointer++ = GIF_mtk_suffix[code];
                              code = GIF_mtk_prefix[code];
                          }

                          *stack_pointer++ = code;
                          if (GIF_slot < GIF_top_slot)
                          {
                              GIF_mtk_suffix[GIF_slot] = fc = code;
                              GIF_mtk_prefix[GIF_slot++] = oc;
                              oc = c;
                          }

                          if (GIF_slot >= GIF_top_slot)
                          {
                              if (GIF_current_code_size < 12)
                              {
                                  GIF_top_slot <<= 1;
                                  GIF_current_code_size++;
                              }
                          }

                          while (stack_pointer > GIF_mtk_stack)
                          {
                              if ((--want_pixels) < 0)
                              {
                                  finished_decoding = 1;
                                  break;
                              }
                              --stack_pointer;
                          }
                      }
                  }
              }

              (*framecount) += 1;

              /* peek if is last frame */
              {
                  U8 test1, test2;

                  PEEK_U8(src, test1);
                  PEEK_U8_N(src, test2, 1);
                  if ((test1 == '\0') && (test2 == ';'))
                  {
                      /* GDI_GIF_LAST_FRAME;; */
                      return MMI_TRUE;
                  }
              }
              break;

          case '\0':
              if (src >= buf + file_size)
              {
                  /* GDI_GIF_LAST_FRAME */
                  return MMI_TRUE;
              }
              break;

          case ';':
              /* GDI_GIF_LAST_FRAME;; */
              return MMI_TRUE;
              break;
      }
  } while (src < buf + file_size);

  return MMI_TRUE;
}


/*****************************************************************************
 * FUNCTION
 *  image_png_get_dimension
 * DESCRIPTION
 *  get dimension of a png from file
 * PARAMETERS
 *  filename    [IN]
 *  width       [OUT]
 *  height      [OUT]
 * RETURNS
 *  MMI_BOOL	MMI_TRUE or MMI_FALSE
 *****************************************************************************/
static MMI_BOOL image_png_get_dimension(char *filename, U32 *width, U32 *height)
{
  FILE *fp;
  U8 buf[PNG_INFO_SIZE];
  U8 *src;

  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), PNG_INFO_SIZE, fp) != PNG_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 and get PNG dimension */
  if (memcmp(src, "\x89PNG\x0d\x0a\x1a\x0a", 8) == 0)  /* PNG signature */
  {
      if (*((U32*) (src + 8)) == 13 << 24)             /* must be IHDR, length = 13,but LSB */
      {
          if (memcmp(src + 12, "IHDR", 4) == 0)        /* must be 'IHDR' */
          {
              src += 16;
              *width = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | (src[3]);
              src += 4;
              *height = (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | (src[3]);
              return MMI_TRUE;
          }
      }
  }
      
  return MMI_FALSE;
}


/*****************************************************************************
 * FUNCTION
 *  image_jpg_get_dimension
 * DESCRIPTION
 *  get dimension of a jpg from file
 * PARAMETERS
 *  filename    [IN]
 *  width       [OUT]
 *  height      [OUT]
 * RETURNS
 *  MMI_BOOL	MMI_TRUE or MMI_FALSE
 *****************************************************************************/
static MMI_BOOL image_jpg_get_dimension(char *filename, U32 *width, U32 *height)
{
  FILE *fp;

  U32 index, index_offset;
  U16 marker_length;
  U8 jpg_byte1, jpg_byte2, tmp_byte;

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

	index = 0;

	jpg_byte1 = fgetc(fp);
	jpg_byte2 = fgetc(fp);

	/* check first two byte to see if is valid jpeg file */
  if ((jpg_byte1 != 0xFF) || (jpg_byte2 != 0xD8))
	{
    MYFCLOSE(fp);
		return MMI_FALSE;
	}

  *width = *height = 0;

	/* parse bytestream */
	do
	{
		if (feof(fp))
		{
			break;
		}

		do
		{
			tmp_byte = fgetc(fp);
		} while (tmp_byte != 0xFF);

		jpg_byte1 = 0xFF;
		jpg_byte2 = fgetc(fp);

		switch (jpg_byte2)
		{
			case JPEG_MARKER_SOF0:
			case JPEG_MARKER_SOF2:
				marker_length = fgetc(fp) << 8;
				marker_length |= fgetc(fp);
				marker_length -= 2;

				fgetc(fp);  /* precision */
				*height = fgetc(fp) << 8;
				*height |= fgetc(fp);
				*width = fgetc(fp) << 8;
				*width |= fgetc(fp);

				/* set terminate byte */
				jpg_byte2 = 0xD9;
				break;

			case JPEG_MARKER_SOS:
				break;

			case 0xC8:
			case 0x00:
				break;

			default:
				if ((jpg_byte2 == JPEG_MARKER_SOF1) ||
				    ((jpg_byte2 >= JPEG_MARKER_SOF3) && (jpg_byte2 <= JPEG_MARKER_SOF15)) ||
					(jpg_byte2 == JPEG_MARKER_DQT) || (jpg_byte2 == JPEG_MARKER_DNL) ||
					(jpg_byte2 == JPEG_MARKER_DRI) || (jpg_byte2 == JPEG_MARKER_DHP) ||
					(jpg_byte2 == JPEG_MARKER_EXP) || (jpg_byte2 == JPEG_MARKER_COM) ||
					((jpg_byte2 >= JPEG_MARKER_APP0) && (jpg_byte2 <= JPEG_MARKER_APP15)))
				{
					U8 *dummy;

					index_offset = fgetc(fp) << 8;
					index_offset |= fgetc(fp);
					index_offset -= 2;

					dummy = (U8 *)malloc(index_offset*sizeof(U8));
					fread(dummy, sizeof(U8), index_offset, fp);
					free(dummy);
				}
				break;
		}
	} while (!((jpg_byte1 == 0xFF) && (jpg_byte2 == 0xD9)));

  MYFCLOSE(fp);

  return MMI_TRUE;
}


/*****************************************************************************
 * FUNCTION
 *  Image_Get_Dimensions
 * DESCRIPTION
 *  Get the dimensions of the image resource
 * PARAMETERS
 *  filename    [IN]
 *  width       [OUT]
 *  height      [OUT]
 * RETURNS
 *  int			>=0: frame count, <0: failed
 *****************************************************************************/
U32 Image_Get_Dimensions(char *filename, U32 *width, U32 *height)
{
    char ext[4] = {0};	/* filename extension */
    U32 i = 0;
    MMI_BOOL ret;
    U32 framecount = 1;
    
    /* get filename extension and convert it to upper case */
    for(i = 0; i < 3; i++)
    {
        ext[i] = toupper(filename[strlen(filename) - 3 + i]);
    }
    ext[3] = '\0';

    *width = *height = 0;

    /* get dimension of BMP or PBM file */
    if ((strncmp(ext, "BMP", 3) == 0) ||(strncmp(ext, "PBM", 3) == 0))
    {
        ret = image_bmp_get_dimension(filename, width, height);
    }
    /* get dimension of GIF file */
    else if ((strncmp(ext, "GIF", 3) == 0))
    {
        ret = image_gif_get_dimension(filename, width, height);
        if (ret == MMI_TRUE)
        {
            ret = image_gif_get_frame_count(filename, &framecount);
        }
    }
    /* get dimension of PNG file */
    else if ((strncmp(ext, "PNG", 3) == 0) || (strncmp(ext, "PPN", 3) == 0))
    {
        ret = image_png_get_dimension(filename, width, height);
    }
    /* get dimension of JPG file */
    else if ((strncmp(ext, "JPG", 3) == 0))
    {
        ret = image_jpg_get_dimension(filename, width, height);
    }
    else
    {
        ret = MMI_FALSE;
    }

    if (ret == MMI_FALSE)
    {
        fprintf(stderr, "File error:\t\t%s\n", filename);
        return 0;
    }
    else
    {
        return framecount;
    }
}

⌨️ 快捷键说明

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