imgdcd_image.c

来自「This is a resource based on j2me embedde」· C语言 代码 · 共 154 行

C
154
字号
/* *    * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. *//** * @file * @brief Common internal functions of image. */#include <midpError.h>#include <string.h>#include <imgdcd_image_util.h>/* PNG file header */const unsigned char imgdcd_png_header[16] = {0x89, 'P', 'N', 'G',				      0x0d, 0x0a, 0x1a, 0x0a,				      0x00, 0x00, 0x00, 0x0d,				      0x49, 0x48, 0x44, 0x52};/* JPEG file header */const unsigned char imgdcd_jpeg_header[4] = {0xff, 0xd8, 0xff, 0xe0};/* RAW platform dependent image file header */const unsigned char imgdcd_raw_header[4] = {0x89, 'S', 'U', 'N'};/** * Identify image format from a given image buffer. * * @param imgBuf buffer contains the image data * @param length    number of bytes of the buffer * @param format    return image format * @param width	    return image width * @param height    return image height * * @return one of error codes: *		MIDP_ERROR_NONE, *		MIDP_ERROR_UNSUPPORTED *		MIDP_ERROR_IMAGE_CORRUPTED */MIDP_ERROR imgdcd_image_get_info(unsigned char *imgBuf,			        unsigned int length,			        imgdcd_image_format *format,			        unsigned int *width,			        unsigned int *height) {    /* check for a PNG header signature */    if ((length >= 4 + 8) &&        (memcmp(imgBuf, &imgdcd_raw_header, 4) == 0)) {	*format = IMGDCD_IMAGE_FORMAT_RAW;	/* Assume default endian */	*width  = ((imgdcd_image_buffer_raw *)imgBuf)->width;	*height = ((imgdcd_image_buffer_raw *)imgBuf)->height;	return MIDP_ERROR_NONE;    } else if ((length >= 16 + 8) &&	       (memcmp(imgBuf, &imgdcd_png_header, 16) == 0)) {        *format = IMGDCD_IMAGE_FORMAT_PNG;	/* Big endian */	*width  = (imgBuf[16] << 24) |		  (imgBuf[17] << 16) |		  (imgBuf[18] <<  8) |		   imgBuf[19];	*height = (imgBuf[20] << 24) |		  (imgBuf[21] << 16) |		  (imgBuf[22] <<  8) |		   imgBuf[23];	return MIDP_ERROR_NONE;    } else if ((length >= 4 + 8) &&               (memcmp(imgBuf, &imgdcd_jpeg_header, 4) == 0)) {        unsigned int i, field_len;	*format = IMGDCD_IMAGE_FORMAT_JPEG;	/*         * Find SOF (Start Of Frame) marker:         * format of SOF         *   2 bytes    Marker Identity  (0xff 0xc<N>)         *   2 bytes    Length of block         *   1 byte     bits/sample         *   2 bytes    Image Height         *   2 bytes    Image Width         *   1 bytes    Number of components         *   n bytes    the components         *         * Searching for the byte pair representing SOF is unsafe         * because a prior marker might contain the SOFn pattern         * so we must skip over the preceding markers.         *         * When editing this code, don't forget to make the appropriate changes         * in src/lowlevelui/graphics/putpixel/classes/javax/microedition/         * lcdui/ImageDataFactory.java.         */        i = 2;        while (i + 8 < length) {            if (imgBuf[i] != 0xff) {                break;            }            if ((imgBuf[i+1] & 0xf0) == 0xc0) {                unsigned char code = imgBuf[i+1];                if (code != 0xc4 || code != 0xcc) {                    /* Big endian */                    *height = (imgBuf[i + 5] << 8) | imgBuf[i + 6];                    *width  = (imgBuf[i + 7] << 8) | imgBuf[i + 8];                    return MIDP_ERROR_NONE;                }            }            /* Go to the next marker */            field_len = (imgBuf[i + 2] << 8) | imgBuf[i + 3];            i += field_len + 2;        }        /* Reach here means we didn't find Marker */        return MIDP_ERROR_IMAGE_CORRUPTED;    } else {        *format = IMGDCD_IMAGE_FORMAT_UNSUPPORTED;        return MIDP_ERROR_UNSUPPORTED;    }}

⌨️ 快捷键说明

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