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

📄 bpe_decoder.c

📁 CCSDS空间图像图像压缩标准c源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
Implementation of CCSDS 122.0-B-1 Recommended Standard
Please note:
(1)	Before you download and use the program, you must read and agree the license agreement carefully. 
(2)	We supply the source code and program WITHOUT ANY WARRANTIES. The users will be responsible 
        for any loses or damages caused by the use of the source code and the program. 

Author: 
Hongqiang Wang
Department of Electrical Engineering
University of Nebraska-Lincoln
Email: hqwang@bigred.unl.edu, hqwang@eecomm.unl.edu

Your comment and suggestions are welcome. Please report bugs to me via email and I would greatly appreciate it. 
Jan. 21, 2007
*/ 
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include "global.h"


extern void AdjustOutPut(StructCodingPara * PtrCoding, BitPlaneBits * BlockCodingInfo);

extern void CoeffDegroup(int **img_wav,  int rows,	 int cols);

extern void CoeffDegroupFloating(float **img_wav,  int rows,  int cols);

extern void HeaderReadin(StructCodingPara *PtrCoding); 

extern void DWT_Reverse(int **block,  StructCodingPara *PtrCoding);

extern void DWT_ReverseFloating(float **block,  
				 StructCodingPara *PtrCoding);

extern short DCDeCoding(StructCodingPara *PtrCoding, 
						StructFreBlockString * ,  
						BitPlaneBits *BlockInfo);


extern void  ACBpeDecoding(StructCodingPara *PtrCoding,
					 BitPlaneBits *BlockCodingInfo);


short ImageWrite(StructCodingPara *StrPtr, int **image);

short ImageWrite(StructCodingPara *StrPtr,  int **image)
{
	UINT32 r = 0; 
	UINT32 i = 0;
	FILE *outfile = NULL;
	
	if((outfile = fopen(StrPtr->CodingOutputFile,"wb")) == NULL)
		ErrorMsg(BPE_FILE_ERROR);
	
	StrPtr->ImageRows = StrPtr->ImageRows - StrPtr->PtrHeader->Header.Part1.PadRows_3Bits;

	if(StrPtr->PtrHeader->Header.Part4.PixelBitDepth_4Bits <= 8
		&& StrPtr->PtrHeader->Header.Part4.PixelBitDepth_4Bits != 0)
	{
		if(StrPtr->PtrHeader->Header.Part4.SignedPixels == FALSE) // unsigned image
		{	
			UCHAR8 *temp;		
			temp = (UCHAR8 *)calloc(sizeof(UCHAR8), StrPtr->ImageWidth);

			for(r = 0; r< StrPtr->ImageRows; r++)
			{
				for(i = 0; i < StrPtr->ImageWidth; i++)
				{
					image[r][i] = (image[r][i] > 0xFF)?0xFF :image[r][i] ;
					image[r][i] = (image[r][i] < 0)?0 :image[r][i] ;
					temp[i] = (UCHAR8)image[r][i];
				}
				fwrite(temp, StrPtr->ImageWidth, sizeof(char),outfile);	
			}
			free(temp);
		}
		else
		{
			char *temp;		
			temp = (char *)calloc(sizeof(char), StrPtr->ImageWidth);

			for(r=0; r< StrPtr->ImageRows; r++)
			{
				for(i = 0; i < StrPtr->ImageWidth; i++)
				{
					image[r][i] = (image[r][i] > 127)?127 :image[r][i] ;
					image[r][i] = (image[r][i] <-128 )?-128 :image[r][i] ;
					temp[i] = (char)image[r][i];
				}
				fwrite(temp, StrPtr->ImageWidth, sizeof(char),outfile);	
			}
			free(temp);
		}
	}
	else if(StrPtr->PtrHeader->Header.Part4.PixelBitDepth_4Bits == 0 ||
		StrPtr->PtrHeader->Header.Part4.PixelBitDepth_4Bits <= 15) // it is 16 bits
	{
		if(StrPtr->PtrHeader->Header.Part4.SignedPixels == FALSE) // unsigned image
		{	
			WORD16 *temp_16;	
			temp_16 = (WORD16 *)calloc(sizeof(WORD16), StrPtr->ImageWidth);
			if(StrPtr->PixelByteOrder == 1) // LSB first	
				for(r = 0; r < StrPtr->ImageRows; r++)
				{
					for(i = 0; i < StrPtr->ImageWidth; i++)
					{
						image[r][i] = (image[r][i] > 0xFFFF) ? 0xFFFF : image[r][i];
						image[r][i] = (image[r][i] < 0) ? 0 : image[r][i];
						temp_16[i] = (WORD16)image[r][i] ;
					}
					fwrite(temp_16, StrPtr->ImageWidth, sizeof(WORD16), outfile);
				}
			else
			{	
				for(r = 0; r < StrPtr->ImageRows; r++)
				{
					for(i = 0; i < StrPtr->ImageWidth; i++)
					{
						image[r][i] = (image[r][i] > 0xFFFF) ? 0xFFFF : image[r][i];
						image[r][i] = (image[r][i] < 0) ? 0 : image[r][i];						
						image[r][i] = (image[r][i] << 8) + (image[r][i] >> 8);
						temp_16[i] =(WORD16)image[r][i] ;
					}
					fwrite(temp_16, StrPtr->ImageWidth, sizeof(WORD16), outfile);
				}
			}
			free(temp_16);
		}	
		else
		{
			short *temp_16;	
			temp_16 = (short *)calloc(sizeof(short), StrPtr->ImageWidth);
			if(StrPtr->PixelByteOrder == 1) // LSB first	
				for(r = 0; r < StrPtr->ImageRows; r++)
				{
					for(i = 0; i < StrPtr->ImageWidth; i++)
					{						
						image[r][i] = (image[r][i] > 0x8FFF) ? 0x8FFF : image[r][i];
						image[r][i] = (image[r][i] < -32768) ? -32768 : image[r][i];
						image[r][i] = (image[r][i] > 0xFFFF) ? 0xFFFF : image[r][i];
						image[r][i] = (image[r][i] < 0) ? 0 : image[r][i];
						image[r][i] = (image[r][i] << 8) + (image[r][i] >> 8);
						temp_16[i] = (short)image[r][i] ;
					}
					fwrite(temp_16, StrPtr->ImageWidth, sizeof(short), outfile);
				}
			else
			{	
				for(r = 0; r < StrPtr->ImageRows; r++)
				{
					for(i = 0; i < StrPtr->ImageWidth; i++)
					{
						
						image[r][i] = (image[r][i] > 0x8FFF) ? 0x8FFF : image[r][i];
						image[r][i] = (image[r][i] < -32768) ? -32768 : image[r][i];
						temp_16[i] =(short)image[r][i] ;
					}
					fwrite(temp_16, StrPtr->ImageWidth, sizeof(short), outfile);
				}
			}
			free(temp_16);
		}
	}
	fclose(outfile);
	return BPE_OK;
}






void DecodingOutputInteger(StructCodingPara *PtrCP,
					int **imgout_integercase)
{	
	CoeffDegroup(imgout_integercase, PtrCP->ImageRows, PtrCP->ImageWidth + PtrCP->PadCols_3Bits);

	DWT_Reverse(imgout_integercase, PtrCP); 

	if (PtrCP->PtrHeader->Header.Part4.TransposeImg == TRANSPOSE)
	{
		UINT32 i = 0; 
		UINT32 j = 0;
		int **transposedimg = (int **)calloc(PtrCP->ImageRows,sizeof(int *)); 
		
		for(i = 0; i < PtrCP->ImageRows; i++)
			transposedimg[i] = (int *)calloc((PtrCP->ImageWidth),sizeof(int));	

		for( i = 0 ; i < PtrCP->ImageRows; i ++)
			for(j = 0; j < PtrCP->ImageWidth; j++)
				transposedimg[j][i] = imgout_integercase[i][j];
			
		ImageWrite(PtrCP, transposedimg);
	}		
	else
		ImageWrite(PtrCP, imgout_integercase);
	
	return;	
}

short ImageWriteFloat(StructCodingPara *StrPtr,
				 float **image)
{
	UINT32 r = 0; 
	UINT32 i = 0;
	FILE *outfile;
	
	if((outfile = fopen(StrPtr->CodingOutputFile,"wb")) == NULL)
		ErrorMsg(BPE_FILE_ERROR);
	
	if(StrPtr->PtrHeader->Header.Part4.PixelBitDepth_4Bits <= 8
		&& StrPtr->PtrHeader->Header.Part4.PixelBitDepth_4Bits != 0)
	{
		if(StrPtr->PtrHeader->Header.Part4.SignedPixels == FALSE) // unsigned image
		{	
			UCHAR8 *temp = (UCHAR8 *)calloc(sizeof(UCHAR8), StrPtr->ImageWidth);

			for(r = 0; r< StrPtr->ImageRows; r++)
			{
				for(i = 0; i < StrPtr->ImageWidth; i++)
				{
					image[r][i] = (image[r][i] > 0xFF)?0xFF :image[r][i] ;
					image[r][i] = (image[r][i] < 0)?0 :image[r][i] ;
					temp[i] = (UCHAR8)image[r][i];
				}
				fwrite(temp, StrPtr->ImageWidth, sizeof(char),outfile);	
			}
			free(temp);
		}
		else
		{
			char *temp = (char *)calloc(sizeof(char), StrPtr->ImageWidth);

			for(r=0; r< StrPtr->ImageRows; r++)
			{
				for(i = 0; i < StrPtr->ImageWidth; i++)
				{
					image[r][i] = (image[r][i] > 127)?127 :image[r][i] ;
					image[r][i] = (image[r][i] <-128 )?-128 :image[r][i] ;
					temp[i] = (char)image[r][i];
				}
				fwrite(temp, StrPtr->ImageWidth, sizeof(char),outfile);	
			}
			free(temp);
		}
	}
	else if(StrPtr->PtrHeader->Header.Part4.PixelBitDepth_4Bits == 0 ||
		StrPtr->PtrHeader->Header.Part4.PixelBitDepth_4Bits <= 15) // it is 16 bits
	{
		if(StrPtr->PtrHeader->Header.Part4.SignedPixels == FALSE) // unsigned image
		{	
			WORD16 *temp_16 = (WORD16 *)calloc(sizeof(WORD16), StrPtr->ImageWidth);
			if(StrPtr->PixelByteOrder == 1) // LSB first	
				for(r = 0; r < StrPtr->ImageRows; r++)
				{

⌨️ 快捷键说明

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