很早之前写的,主要是有的时候,png图像很多,而可以使用的容量又很少,为了将如此多的图像加入进去,只能将png中无用的信息去掉,然后整理到一个文件,压缩打包。下面的代码就是去除png图像中的无用信息。有些时候,一张png也就1KB或者不足1KB,而无用的信息就占了几十或者几百字节,挺浪费的。下面是代码:
#include "stdio.h"
#include "stdlib.h"
int main( int argc, char* argv[] )
{
if( argc != 3 )
{
printf( "use pngcompress pngfilename desfilename\n" );
return 0;
}
printf( "-----------compress png file:%s------------%s\n", argv[1], argv[2]);
FILE* fp = NULL;
fp = fopen( argv[1], "rb" );
int length = fseek( fp, 0, SEEK_END );
length = ftell( fp );
fseek( fp, 0, SEEK_SET );
char* data = new char[length];
fread( data, length, 1, fp );
fclose( fp );
fp = NULL;
fp = fopen( argv[2], "w+b" );
for( int i = 0; i < length; i++ )
{
if( i < length - 4 )
{
if(
( data[i] == 't' && data[i + 1]=='E' && data[i + 2] == 'X' && data[i + 3] == 't' )
|| ( data[i] == 'z' && data[i+1] == 'T' && data[i + 2] == 'X' && data[i + 3] == 't' )
|| ( data[i] == 's' && data[i + 1] == 'B' && data[i + 2] == 'I' && data[i + 3] == 'T' )
|| ( data[i] == 'b' && data[i + 1] == 'K' && data[i + 2] == 'G' && data[i + 3] == 'D' )
|| ( data[i] == 'c' && data[i + 1] == 'H' && data[i + 2] == 'R' && data[i + 3] == 'M' )
|| ( data[i] == 'g' && data[i + 1] == 'A' && data[i + 2] == 'M' && data[i + 3] == 'A' )
|| ( data[i] == 'h' && data[i + 1] == 'I' && data[i + 2] == 'S' && data[i + 3] == 'T' )
|| ( data[i] == 'o' && data[i + 1] == 'F' && data[i + 2] == 'F' && data[i + 3] == 's' )
|| ( data[i] == 'p' && data[i + 1] == 'H' && data[i + 2] == 'Y' && data[i + 3] == 's' )
|| ( data[i] == 's' && data[i + 1] == 'C' && data[i + 2] == 'A' && data[i + 3] == 'L' )
|| ( data[i] == 't' && data[i + 1] == 'I' && data[i + 2] == 'M' && data[i + 3] == 'E' )
|| ( data[i] == 'f' && data[i + 1] == 'R' && data[i + 2] == 'A' && data[i + 3] == 'c' )
|| ( data[i] == 'g' && data[i + 1] == 'I' && data[i + 2] == 'F' && data[i + 3] == 'g' )
|| ( data[i] == 'g' && data[i + 1] == 'I' && data[i + 2] == 'F' && data[i + 3] == 't' )
|| ( data[i] == 'g' && data[i + 1] == 'I' && data[i + 2] == 'F' && data[i + 3] == 'x' )
|| ( data[i] == 'b' && data[i + 1] == 'K' && data[i + 2] == 'G' && data[i + 3] == 'D' )
)
{
fseek( fp, -4, SEEK_CUR );
i += data[i - 1] + 8;
}
}
fwrite( &data[i], 1, 1, fp );
}
delete[] data;
fclose( fp );
return 0;
}
应该不管是那个平台都可以编译通过的。编译成命令行方式是因为我需要将它和makefile结合。