⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bitio.c

📁 该程序把数字图像处理与小波变换结合起来
💻 C
字号:
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
/* The codes are from the book "The Data Compression Book" by Mark Nelson 
 * and Jean-Loup Gailly, M&T Books 1996.
 *
 * I did some changes to the end of file issue, but not really successful.
 *
 * Mow-Song, Ng 2/9/2002ge
 * msng@mmu.edu.my
 * http://www.pesona.mmu.edu.my/~msng
 *
 * I do not claim copyright to the code, but if you use them or modify them,
 * please drop me a mail.
 * 
 */
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/

#include "bitio.h"

BIT_FILE *OpenOutputBitFile(char *name )
{
	//定义比特流文件句柄
	BIT_FILE *bit_file;
	//分配相应的数据缓存空间
   bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) );
	//打开磁盘文件,bit_file将获得其句柄
	if ( bit_file == NULL )
		return( bit_file );
	bit_file->file = fopen( name, "wb" );
	//如何文件打开失败,返回NULL
	if (bit_file->file == NULL){
		return NULL;
	}
	//写入比特流文件的标志信息
   bit_file->rack = 0;
   bit_file->mask = 0x80;
	//返回文件的有效值
	return( bit_file );
}

BIT_FILE *OpenInputBitFile(char *name )
{
	//定义比特流文件句柄
	BIT_FILE *bit_file;
	//分配相应的数据缓存空间
   bit_file = (BIT_FILE *) calloc( 1, sizeof( BIT_FILE ) );
	//打开磁盘文件,bit_file将获得其句柄
	if ( bit_file == NULL )
		return( bit_file );
	bit_file->file = fopen( name, "rb" );
	//如何文件打开失败,返回NULL
	if (bit_file->file == NULL){
		return NULL;
	}
	//写入比特流文件的标志信息
   bit_file->rack = 0;
   bit_file->mask = 0x80;
	//返回文件的有效值
	return( bit_file );

}

void CloseOutputBitFile(BIT_FILE *bit_file )
{
   if ( bit_file->mask != 0x80 )
      if ( putc( bit_file->rack, bit_file->file ) != bit_file->rack )
         BitioError("Fatal error in CloseBitFile!\n" );
		fclose( bit_file->file );
		free( (char *) bit_file );
}

void CloseInputBitFile( BIT_FILE *bit_file )
{
   fclose( bit_file->file );
   free( (char *) bit_file );
}

void OutputBit(BIT_FILE *bit_file, int bit)
{
   if ( bit ){
      bit_file->rack |= bit_file->mask;
   }
   
   bit_file->mask >>= 1;
	
   if ( bit_file->mask == 0 ) {
      if ( putc( bit_file->rack, bit_file->file ) != bit_file->rack ){
         BitioError("Fatal error in OutputBit!\n" );
      }
      bit_file->rack = 0;
      bit_file->mask = 0x80;
   }
}

void OutputBits( BIT_FILE *bit_file, unsigned long code, int count)
{
   unsigned long mask;
	
   mask = 1L << ( count - 1 );
	
   while ( mask != 0) {
      if ( mask & code ){
         bit_file->rack |= bit_file->mask;
      }
		
      bit_file->mask >>= 1;
		
      if ( bit_file->mask == 0 ) {
         if ( putc( bit_file->rack, bit_file->file ) != bit_file->rack ){
            BitioError( "Fatal error in OutputBit!\n" );
         }
         
         bit_file->rack = 0;
         bit_file->mask = 0x80;
      }
		
      mask >>= 1;
   }
}

int InputBit(BIT_FILE *bit_file, int *EOFflag)
{
   int value;
	
   *EOFflag=0;
   if ( bit_file->mask == 0x80 ){
      bit_file->rack = getc( bit_file->file );	
      if ( bit_file->rack == EOF ){
         *EOFflag=1;
		}
   }
	
   value = bit_file->rack & bit_file->mask;
   bit_file->mask >>= 1;
   
   if ( bit_file->mask == 0 ){
      bit_file->mask = 0x80;
   }
	
   return( value ? 1 : 0 );
}

unsigned long InputBits(BIT_FILE *bit_file, int bit_count, int *EOFflag)
{
   unsigned long mask;
   unsigned long return_value;
	
   *EOFflag=0;
   mask = 1L << ( bit_count - 1 );
	
   return_value = 0;
	
   while ( mask != 0) {
      if ( bit_file->mask == 0x80 ) {
         bit_file->rack = getc( bit_file->file );
         
         if ( bit_file->rack == EOF ){
            *EOFflag=1;
         }
      }
      
      if ( bit_file->rack & bit_file->mask ){
         return_value |= mask;
      }
		
      mask >>= 1;
      bit_file->mask >>= 1;
      
      if ( bit_file->mask == 0 ){
         bit_file->mask = 0x80;
      }
   }
	
   return( return_value );
}

void FilePrintBinary(FILE *file, unsigned int code, int bits)
{
   unsigned int mask;
	
   mask = 1 << ( bits - 1 );
   while ( mask != 0 ) {
      if ( code & mask ){
         fputc( '1', file );
      }
      else{
         fputc( '0', file );
      }
      mask >>= 1;
   }
}

void BitioError(char *fmt, ...)
{
	va_list argptr;
	
	va_start( argptr, fmt );
	printf( "BitioError: " );
	vprintf( fmt, argptr );
	va_end( argptr );
	exit( -1 );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -