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

📄 gif2png.c

📁 神龙卡开发原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * gif2png : convert a GIF to a PNGwith the same palette * * Fabrice Gautier (c) 2002 Sigma Desings, Inc. * *//*  * Derived from Microwindows' devimage.c * * Copyright (c) 2000, 2001 Greg Haerr <greg@censoft.com> * Portions Copyright (c) 2000 Martin Jolicoeur <martinj@visuaide.com> * Portions Copyright (c) 2000 Alex Holden <alex@linuxhacker.org> * */#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/mman.h>#include <sys/stat.h> #include <png.h>#define TRUE 1#define FALSE 0#define EPRINTF(x...) fprintf(stderr,x)/* * Buffered input functions to replace stdio functions */typedef struct {  /* structure for reading images from buffer   */  void *start;    /* The pointer to the beginning of the buffer */  int offset;     /* The current offset within the buffer       */  int size;       /* The total size of the buffer               */} buffer_t;static voidbinit(void *in, int size, buffer_t *dest){	dest->start = in;	dest->offset = 0;	dest->size = size;} static intbseek(buffer_t *buffer, int offset, int whence){	int new;	switch(whence) {	case SEEK_SET:		if (offset >= buffer->size || offset < 0)			return(-1);		buffer->offset = offset;		return(0);	case SEEK_CUR:		new = buffer->offset + offset;		if (new >= buffer->size || new < 0)			return(-1);		buffer->offset = new;		return(0);	case SEEK_END:		if (offset >= buffer->size || offset > 0)			return(-1);		buffer->offset = (buffer->size - 1) - offset;		return(0);	default:		return(-1);	}}   static intbread(buffer_t *buffer, void *dest, int size){	int copysize = size;	if (buffer->offset == buffer->size)		return(0);	if (buffer->offset + size > buffer->size) 		copysize = (buffer->size - buffer->offset);	memcpy((void *)dest, (void *)(buffer->start + buffer->offset),copysize);	buffer->offset += copysize;	return(copysize);} /* Code for GIF decoding has been adapted from XPaint:                   *//* +-------------------------------------------------------------------+ *//* | Copyright 1990, 1991, 1993 David Koblas.			       | *//* | Copyright 1996 Torsten Martinsen.				       | *//* |   Permission to use, copy, modify, and distribute this software   | *//* |   and its documentation for any purpose and without fee is hereby | *//* |   granted, provided that the above copyright notice appear in all | *//* |   copies and that both that copyright notice and this permission  | *//* |   notice appear in supporting documentation.  This software is    | *//* |   provided "as is" without express or implied warranty.	       | *//* +-------------------------------------------------------------------+ *//* Portions Copyright (C) 1999  Sam Lantinga*//* Adapted for use in SDL by Sam Lantinga -- 7/20/98 *//*    This library is free software; you can redistribute it and/or    modify it under the terms of the GNU Library General Public    License as published by the Free Software Foundation; either    version 2 of the License, or (at your option) any later version.    This library 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    Library General Public License for more details.    You should have received a copy of the GNU Library General Public    License along with this library; if not, write to the Free    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA*//* GIF stuff*//* * GIF decoding routine */#define	MAXCOLORMAPSIZE		256#define	MAX_LWZ_BITS		12#define INTERLACE		0x40#define LOCALCOLORMAP		0x80#define CM_RED		0#define CM_GREEN	1#define CM_BLUE		2#define BitSet(byte, bit)	(((byte) & (bit)) == (bit))#define	ReadOK(src,buffer,len)	bread(src, buffer, len)#define LM_to_uint(a,b)		(((b)<<8)|(a))struct {    unsigned int Width;    unsigned int Height;    unsigned char ColorMap[3][MAXCOLORMAPSIZE];    unsigned int BitPixel;    unsigned int ColorResolution;    unsigned int Background;    unsigned int AspectRatio;    int GrayScale;} GifScreen;static struct {    int transparent;    int delayTime;    int inputFlag;    int disposal;} Gif89;static int ReadColorMap(buffer_t *src, int number,			unsigned char buffer[3][MAXCOLORMAPSIZE], int *flag);static int DoExtension(buffer_t *src, int label);static int GetDataBlock(buffer_t *src, unsigned char *buf);static int GetCode(buffer_t *src, int code_size, int flag);static int LWZReadByte(buffer_t *src, int flag, int input_code_size);static int ReadImage(buffer_t* src, const char *png_filename, 		     int len, int height, int cmapSize,		     unsigned char cmap[3][MAXCOLORMAPSIZE],		     int gray, int interlace, int ignore);static intLoadGIF(buffer_t *src, const char *png_filename){    unsigned char buf[16];    unsigned char c;    unsigned char localColorMap[3][MAXCOLORMAPSIZE];    int grayScale;    int useGlobalColormap;    int bitPixel;    int imageCount = 0;    char version[4];    int imageNumber = 1;    int ok = 0;    bseek(src, 0, SEEK_SET);//    pimage->imagebits = NULL;//    pimage->palette = NULL;    if (!ReadOK(src, buf, 6))        return 0;		/* not gif image*/    if (strncmp((char *) buf, "GIF", 3) != 0)        return 0;    strncpy(version, (char *) buf + 3, 3);    version[3] = '\0';    if (strcmp(version, "87a") != 0 && strcmp(version, "89a") != 0) {	EPRINTF("LoadGIF: GIF version number not 87a or 89a\n");        return 2;		/* image loading error*/    }    Gif89.transparent = -1;    Gif89.delayTime = -1;    Gif89.inputFlag = -1;    Gif89.disposal = 0;    if (!ReadOK(src, buf, 7)) {	EPRINTF("LoadGIF: bad screen descriptor\n");        return 2;		/* image loading error*/    }    GifScreen.Width = LM_to_uint(buf[0], buf[1]);    GifScreen.Height = LM_to_uint(buf[2], buf[3]);    GifScreen.BitPixel = 2 << (buf[4] & 0x07);    GifScreen.ColorResolution = (((buf[4] & 0x70) >> 3) + 1);    GifScreen.Background = buf[5];    GifScreen.AspectRatio = buf[6];    if (BitSet(buf[4], LOCALCOLORMAP)) {	/* Global Colormap */	if (ReadColorMap(src, GifScreen.BitPixel, GifScreen.ColorMap,			 &GifScreen.GrayScale)) {	    EPRINTF("LoadGIF: bad global colormap\n");            return 2;		/* image loading error*/	}    }    do {	if (!ReadOK(src, &c, 1)) {	    EPRINTF("LoadGIF: EOF on image data\n");            goto done;	}	if (c == ';') {		/* GIF terminator */	    if (imageCount < imageNumber) {		EPRINTF("LoadGIF: no image %d of %d\n", imageNumber,imageCount);                goto done;	    }	}	if (c == '!') {		/* Extension */	    if (!ReadOK(src, &c, 1)) {		EPRINTF("LoadGIF: EOF on extension function code\n");                goto done;	    }	    DoExtension(src, c);	    continue;	}	if (c != ',') {		/* Not a valid start character */	    continue;	}	++imageCount;	if (!ReadOK(src, buf, 9)) {	    EPRINTF("LoadGIF: bad image size\n");            goto done;	}	useGlobalColormap = !BitSet(buf[8], LOCALCOLORMAP);	bitPixel = 1 << ((buf[8] & 0x07) + 1);	if (!useGlobalColormap) {	    if (ReadColorMap(src, bitPixel, localColorMap, &grayScale)) {		EPRINTF("LoadGIF: bad local colormap\n");                goto done;	    }	    	    printf("ReadImage :  localColorMap\n");	    ok = ReadImage(src, png_filename, LM_to_uint(buf[4], buf[5]),			      LM_to_uint(buf[6], buf[7]),			      bitPixel, localColorMap, grayScale,			      BitSet(buf[8], INTERLACE),			      imageCount != imageNumber);	} else {	    printf("ReadImage :  globalColorMap\n");	    ok = ReadImage(src, png_filename, LM_to_uint(buf[4], buf[5]),			      LM_to_uint(buf[6], buf[7]),			      GifScreen.BitPixel, GifScreen.ColorMap,			      GifScreen.GrayScale, BitSet(buf[8], INTERLACE),			      imageCount != imageNumber);	}    } while (ok == 0);    if (ok)	    return 1;		/* image load ok*/done:    return 2;			/* image load error*/}static intReadColorMap(buffer_t *src, int number, unsigned char buffer[3][MAXCOLORMAPSIZE],    int *gray){    int i;    unsigned char rgb[3];    int flag;    flag = TRUE;    for (i = 0; i < number; ++i) {	if (!ReadOK(src, rgb, sizeof(rgb)))	    return 1;	buffer[CM_RED][i] = rgb[0];	buffer[CM_GREEN][i] = rgb[1];	buffer[CM_BLUE][i] = rgb[2];	flag &= (rgb[0] == rgb[1] && rgb[1] == rgb[2]);    }#if 0    if (flag)	*gray = (number == 2) ? PBM_TYPE : PGM_TYPE;    else	*gray = PPM_TYPE;#else    *gray = 0;#endif    return FALSE;}static intDoExtension(buffer_t *src, int label){    static unsigned char buf[256];    switch (label) {    case 0x01:			/* Plain Text Extension */	break;    case 0xff:			/* Application Extension */	break;    case 0xfe:			/* Comment Extension */	while (GetDataBlock(src, (unsigned char *) buf) != 0);	return FALSE;    case 0xf9:			/* Graphic Control Extension */	GetDataBlock(src, (unsigned char *) buf);	Gif89.disposal = (buf[0] >> 2) & 0x7;	Gif89.inputFlag = (buf[0] >> 1) & 0x1;	Gif89.delayTime = LM_to_uint(buf[1], buf[2]);	if ((buf[0] & 0x1) != 0)	    Gif89.transparent = buf[3];	while (GetDataBlock(src, (unsigned char *) buf) != 0);	return FALSE;    default:	break;    }    while (GetDataBlock(src, (unsigned char *) buf) != 0);    return FALSE;}static int ZeroDataBlock = FALSE;static intGetDataBlock(buffer_t *src, unsigned char *buf){    unsigned char count;    if (!ReadOK(src, &count, 1))	return -1;    ZeroDataBlock = count == 0;    if ((count != 0) && (!ReadOK(src, buf, count)))	return -1;    return count;}static intGetCode(buffer_t *src, int code_size, int flag){    static unsigned char buf[280];    static int curbit, lastbit, done, last_byte;    int i, j, ret;    unsigned char count;    if (flag) {	curbit = 0;	lastbit = 0;	done = FALSE;

⌨️ 快捷键说明

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