png 图像减容代码

很早之前写的,主要是有的时候,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结合。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据