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 + -
显示快捷键?