icon2gif.c

来自「giflib-4.1.6.tar.gz,最新的GIF 解码库」· C语言 代码 · 共 771 行 · 第 1/2 页

C
771
字号
			"image bits %d by %d\n",			&NewImage->ImageDesc.Width,			&NewImage->ImageDesc.Height) == 2)	{	    int i, j;	    static GifPixelType *Raster, *cp;	    int c;	    if ((Raster = (GifPixelType *) malloc(sizeof(GifPixelType) * NewImage->ImageDesc.Width * NewImage->ImageDesc.Height))		== NULL) {		PARSE_ERROR("Failed to allocate raster block, aborted.");		exit(EXIT_FAILURE);	    }	    if (!GifQuietPrint)		fprintf(stderr, "%s: Image %d at (%d, %d) [%dx%d]:     ",		    PROGRAM_NAME, GifFileOut->ImageCount,		    NewImage->ImageDesc.Left, NewImage->ImageDesc.Top,		    NewImage->ImageDesc.Width, NewImage->ImageDesc.Height);	    cp = Raster;	    for (i = 0; i < NewImage->ImageDesc.Height; i++) {		char	*dp;		for (j = 0; j < NewImage->ImageDesc.Width; j++)		    if ((c = fgetc(txtin)) == EOF) {			PARSE_ERROR("input file ended prematurely.");			exit(EXIT_FAILURE);		    }		    else if (c == '\n')		    {			--j;			++LineNum;		    }		    else if (isspace(c))			--j;		    else if ((dp = strchr(KeyTable, c)))			*cp++ = (dp - KeyTable);		    else {			PARSE_ERROR("Invalid pixel value.");			exit(EXIT_FAILURE);		    }		if (!GifQuietPrint)		    fprintf(stderr, "\b\b\b\b%-4d", i);	    }	    if (!GifQuietPrint)		putc('\n', stderr);	    NewImage->RasterBits = (unsigned char *) Raster;	}	else if (sscanf(buf, "comment"))	{	    MakeExtension(NewImage, COMMENT_EXT_FUNC_CODE);	    while (fgets(buf, sizeof(buf), txtin) != (char *)NULL)		if (strcmp(buf, "end\n") == 0)		    break;	        else		{		    int Len;		    buf[strlen(buf) - 1] = '\0';		    Len = EscapeString(buf, buf);		    if (AddExtensionBlock(NewImage, Len, (unsigned char *)buf) == GIF_ERROR) {			PARSE_ERROR("out of memory while adding comment block.");			exit(EXIT_FAILURE);		    }		}	}	else if (sscanf(buf, "plaintext"))	{	    MakeExtension(NewImage, PLAINTEXT_EXT_FUNC_CODE);	    while (fgets(buf, sizeof(buf), txtin) != (char *)NULL)		if (strcmp(buf, "end\n") == 0)		    break;	        else		{		    int Len;		    buf[strlen(buf) - 1] = '\0';		    Len = EscapeString(buf, buf);		    if (AddExtensionBlock(NewImage, Len, (unsigned char *)buf) == GIF_ERROR) {			PARSE_ERROR("out of memory while adding plaintext block.");			exit(EXIT_FAILURE);		    }		}	}	else if (sscanf(buf, "extension %02x", &ExtCode))	{	    MakeExtension(NewImage, ExtCode);	    while (fgets(buf, sizeof(buf), txtin) != (char *)NULL)		if (strcmp(buf, "end\n") == 0)		    break;	        else		{		    int Len;		    buf[strlen(buf) - 1] = '\0';		    Len = EscapeString(buf, buf);		    if (AddExtensionBlock(NewImage, Len, (unsigned char *)buf) == GIF_ERROR) {			PARSE_ERROR("out of memory while adding extension block.");			exit(EXIT_FAILURE);		    }		}	}	else	{	    (void) fputs(buf, stderr);	    PARSE_ERROR("Syntax error in image description.");	    exit(EXIT_FAILURE);	}    }    if (EGifSpew(GifFileOut) == GIF_ERROR)	HandleGifError(GifFileOut);}static void Gif2Icon(char *FileName,		     int fdin, int fdout,		     char NameTable[]){    int i, ExtCode, ImageNum = 1;    GifPixelType *Line, *cp;    GifRecordType RecordType;    GifByteType *Extension;    GifFileType *GifFile;    if (fdin == -1) {	if ((GifFile = DGifOpenFileName(FileName)) == NULL) {	    PrintGifError();	    exit(EXIT_FAILURE);	}    }    else {	/* Use stdin instead: */	if ((GifFile = DGifOpenFileHandle(fdin)) == NULL) {	    PrintGifError();	    exit(EXIT_FAILURE);	}    }    printf("screen width %d\nscreen height %d\n",	   GifFile->SWidth, GifFile->SHeight);    printf("screen colors %d\nscreen background %d\n\n",	   GifFile->SColorResolution,	   GifFile->SBackGroundColor);    if (GifFile->SColorMap)    {	if (GifFile->SColorMap->ColorCount >= (int)strlen(NameTable))	{	    (void) fprintf(stderr,			   "%s: global color map has unprintable pixels\n",			   FileName);	    exit(EXIT_FAILURE);	}	printf("screen map\n");	for (i = 0; i < GifFile->SColorMap->ColorCount; i++)	    printf("\trgb %03d %03d %03d is %c\n",		   GifFile->SColorMap ->Colors[i].Red,		   GifFile->SColorMap ->Colors[i].Green,		   GifFile->SColorMap ->Colors[i].Blue,		   NameTable[i]);	printf("end\n\n");    }    do {	if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) {	    PrintGifError();	    exit(EXIT_FAILURE);	}	switch (RecordType) {	case IMAGE_DESC_RECORD_TYPE:	    if (DGifGetImageDesc(GifFile) == GIF_ERROR) {		PrintGifError();		exit(EXIT_FAILURE);	    }	    printf("image # %d\nimage left %d\nimage top %d\n",		   ImageNum++,		   GifFile->Image.Left, GifFile->Image.Top);	    if (GifFile->Image.Interlace)		printf("interlaced\n");	    if (GifFile->Image.ColorMap)	    {		if (GifFile->Image.ColorMap->ColorCount >= (int)strlen(NameTable))		{		    (void) fprintf(stderr,				   "%s: global color map has unprintable pixels\n",				   FileName);		    exit(EXIT_FAILURE);		}		printf("image map\n");		for (i = 0; i < GifFile->Image.ColorMap->ColorCount; i++)		    printf("\trgb %03d %03d %03d is %c\n",			   GifFile->Image.ColorMap ->Colors[i].Red,			   GifFile->Image.ColorMap ->Colors[i].Green,			   GifFile->Image.ColorMap ->Colors[i].Blue,			   NameTable[i]);		printf("end\n\n");	    }	    printf("image bits %d by %d\n",		   GifFile->Image.Width, GifFile->Image.Height);	    Line = (GifPixelType *) malloc(GifFile->Image.Width *					   sizeof(GifPixelType));	    for (i = 0; i < GifFile->Image.Height; i++) {		if (DGifGetLine(GifFile, Line, GifFile->Image.Width)		    == GIF_ERROR) {		    PrintGifError();		    exit(EXIT_FAILURE);		}		for (cp = Line; cp < Line + GifFile->Image.Width; cp++)		    putchar(NameTable[*cp]);		putchar('\n');	    }	    free((char *) Line);	    putchar('\n');	    break;	case EXTENSION_RECORD_TYPE:	    if (DGifGetExtension(GifFile, &ExtCode, &Extension) == GIF_ERROR) {		PrintGifError();		exit(EXIT_FAILURE);	    }	    if (ExtCode == COMMENT_EXT_FUNC_CODE)		printf("comment\n");	    else if (ExtCode == PLAINTEXT_EXT_FUNC_CODE)		printf("plaintext\n");	    else if (isalpha(ExtCode))		printf("extension %02x    # %c\n", ExtCode, ExtCode);	    else		printf("extension %02x\n", ExtCode);	    while (Extension != NULL) {		VisibleDumpBuffer((char *)(Extension + 1), Extension[0]);		putchar('\n');		if (DGifGetExtensionNext(GifFile, &Extension) == GIF_ERROR) {		    PrintGifError();		    exit(EXIT_FAILURE);		}	    }	    printf("end\n\n");	    break;	case TERMINATE_RECORD_TYPE:	    break;	default:		/* Should be traps by DGifGetRecordType */	    break;	}    }    while	(RecordType != TERMINATE_RECORD_TYPE);    /* Tell EMACS this is a picture... */    printf("# The following sets edit modes for GNU EMACS\n");    printf("# Local ");		/* ...break this up, so that EMACS doesn't */    printf("Variables:\n");	/* get confused when visiting *this* file! */    printf("# mode:picture\n");    printf("# truncate-lines:t\n");    printf("# End:\n");    if (fdin == -1)	(void) printf("# End of %s dump\n", FileName);    if (DGifCloseFile(GifFile) == GIF_ERROR) {	PrintGifError();	exit(EXIT_FAILURE);    }}static int EscapeString(char *cp, char *tp)/* process standard C-style escape sequences in a string */{    char *StartAddr = tp;    while (*cp)    {	int	cval = 0;	if (*cp == '\\' && strchr("0123456789xX", cp[1]))	{	    char *dp, *hex = "00112233445566778899aAbBcCdDeEfF";	    int dcount = 0;	    if (*++cp == 'x' || *cp == 'X')		for (++cp; (dp = strchr(hex, *cp)) && (dcount++ < 2); cp++)		    cval = (cval * 16) + (dp - hex) / 2;	    else if (*cp == '0')		while (strchr("01234567",*cp) != (char*)NULL && (dcount++ < 3))		    cval = (cval * 8) + (*cp++ - '0');	    else		while ((strchr("0123456789",*cp)!=(char*)NULL)&&(dcount++ < 3))		    cval = (cval * 10) + (*cp++ - '0');	}	else if (*cp == '\\')		/* C-style character escapes */	{	    switch (*++cp)	    {	    case '\\': cval = '\\'; break;	    case 'n': cval = '\n'; break;	    case 't': cval = '\t'; break;	    case 'b': cval = '\b'; break;	    case 'r': cval = '\r'; break;	    default: cval = *cp;	    }	    cp++;	}	else if (*cp == '^')		/* expand control-character syntax */	{	    cval = (*++cp & 0x1f);	    cp++;	}	else	    cval = *cp++;	*tp++ = cval;    }    return(tp - StartAddr);}static void VisibleDumpBuffer(char *buf, int len)/* Visibilize a given string */{    char	*cp;    for (cp = buf; cp < buf + len; cp++)    {	if (isprint((int)(*cp)) || *cp == ' ')	    putchar(*cp);	else if (*cp == '\n')	{	    putchar('\\'); putchar('n');	}	else if (*cp == '\r')	{	    putchar('\\'); putchar('r');	}	else if (*cp == '\b')	{	    putchar('\\'); putchar('b');	}	else if (*cp < ' ')	{	    putchar('\\'); putchar('^'); putchar('@' + *cp);	}	else	    printf("\\0x%02x", *cp);    }}/******************************************************************************* Handle last GIF error. Try to close the file and free all allocated memory. *******************************************************************************/static int HandleGifError(GifFileType *GifFile){    int i = GifLastError();    if (EGifCloseFile(GifFile) == GIF_ERROR) {	GifLastError();    }    return i;}/******************************************************************************* Close both input and output file (if open), and exit.			      *******************************************************************************/static void QuitGifError(GifFileType *GifFileIn, GifFileType *GifFileOut){    PrintGifError();    if (GifFileIn != NULL) DGifCloseFile(GifFileIn);    if (GifFileOut != NULL) EGifCloseFile(GifFileOut);    exit(EXIT_FAILURE);}

⌨️ 快捷键说明

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