📄 pngpal.c
字号:
/* * gif2png : Extract palette from a PNG file * Jasper DVD player utility * * Fabrice Gautier, (c) 2002 Sigma Designs, Inc * */#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>unsigned long swapl(unsigned long l){ char *p; p=(char *)&l; return (p[0]<<24)+(p[1]<<16)+(p[2]<<8)+p[3];}void GetPLTE(int fd, int sz){ int i; unsigned char *pal; if(sz%3){ fprintf(stderr,"Error PLTE len = %d, not multiple of 3\n",sz); return; } pal=(char *)malloc(sz); i=read(fd, pal, sz); if(i!=sz) { fprintf(stderr,"Couldnt read palette read=%d\n",i); return; } printf("//PNG Palette, size= %d\n",sz); for(i=0;i<(sz/3); i++) { printf("RGBDEF( %3u, %3u, %3u ),\n",pal[3*i],pal[3*i+1],pal[3*i+2]); }}int main(int argc, char *argv[]){ char *buf; int fd,r,p; unsigned long cl; unsigned long ct; if(argc<2) { fprintf(stderr,"usage %s filename.gif\n",argv[0]); return 1; } fprintf(stderr,"%s %s\n",argv[0],argv[1]); buf=(char *)malloc(4*1024); if(buf==NULL) return 1; fd=open(argv[1], O_RDONLY); if(fd==-1){ perror("Cannot open file"); return 1; } lseek(fd, 8, SEEK_SET); // skip PNG singature do { // get chunk read(fd, &cl, 4); cl=swapl(cl); r=read(fd, &ct, 4); ct=swapl(ct); if(r==-1) { perror("Cannot read file"); return -1; } if(r==0) { printf("End of file, PLTE not found\n"); break; } if(ct==(('P'<<24) + ('L'<<16) + ('T'<<8) +'E')) { fprintf(stderr,"PLTE found\n"); GetPLTE(fd,cl); break; } fprintf(stderr,"Chunk is %c%c%c%c len=%d\n", ct>>24, ct>>16, ct>>8, ct, cl); lseek(fd, cl+4, SEEK_CUR); } while(1); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -