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