📄 pngpalstrip.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];}#define BUFSIZE 64*1024int main(int argc, char *argv[]){ char *buf; int fd,r; unsigned long cl; unsigned long ct; off_t chunkstart; if(argc<2) { fprintf(stderr,"usage %s filename.png\n",argv[0]); return 1; } fprintf(stderr,"%s %s\n",argv[0],argv[1]); buf=(char *)malloc(BUFSIZE); if(buf==NULL) return 1; fd=open(argv[1], O_RDWR); if(fd==-1){ perror("Cannot open file"); return 1; } //skip PNG signature; chunkstart=lseek(fd, 8, SEEK_SET); 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"); // Seek to next Chunk // (skip cl data bytes +4 bytes for crc) lseek(fd, cl+4, SEEK_CUR); r=read(fd, buf, BUFSIZE); if(r==BUFSIZE) { printf("Error: file size after Palette " "larger than BUFSIZE (%d Bytes)\n", BUFSIZE); } else { ftruncate(fd, chunkstart); lseek(fd, 0, SEEK_END); write(fd, buf, r); } break; } fprintf(stderr,"Chunk is %c%c%c%c len=%lx\n", (char)ct>>24, (char)ct>>16, (char)ct>>8, (char)ct, cl); chunkstart=lseek(fd, cl+4, SEEK_CUR); } while(1); close(fd); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -