📄 imagegetdimension.cpp
字号:
#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 + -