亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? unezw.c

?? EZW編解碼的實現
?? C
字號:
/*
EZW解碼器

解碼器數據掃描的方式:

Morton order scan:
====================================

   1 | 2 |  5   6 | 17  18  21  22
  ---+---|        |
   3 | 4 |  7   8 | 19  20  23  24
  -------+--------|
   9  10 | 13  14 | 25  26  29  30
         |        |
  11  12 | 15  16 | 27  28  31  32
  ----------------+---------------
  33  34   37  38 | 49  50  53  54
                  |
  35  36   39  40 | 51  52  55  56
                  |
  41  42   45  46 | 57  58  61  62
                  |
  43  44   47  48 | 59  60  63  64


Raster scan:
========================

   1 | 2 |  5   6 | 17  18  19  20
  ---+---|        |
   3 | 4 |  7   8 | 21  22  23  24
  -------+--------|
   9  10 | 13  14 | 25  26  27  28
         |        |
  11  12 | 15  16 | 29  30  31  32
  ----------------+---------------
  33  34   35  36 | 49  50  51  52
                  |
  37  38   39  40 | 53  54  55  56
                  |
  41  42   43  44 | 57  58  59  60
                  |
  45  46   47  48 | 61  62  63  64

數據平面的頻段分布:
Subband distribution:
==========================================

  LL | HL | HL   HL | HL   HL   HL   HL
  ---+--- |         |
  LH | HH | HL   HL | HL   HL   HL   HL
  --------+---------|
  LH   LH | HH   HH | HL   HL   HL   HL
          |         |
  LH   LH | HH   HH | HL   HL   HL   HL
  ------------------+------------------
  LH   LH   LH   LH | HH   HH   HH   HH
                    |
  LH   LH   LH   LH | HH   HH   HH   HH
                    |
  LH   LH   LH   LH | HH   HH   HH   HH
                    |
  LH   LH   LH   LH | HH   HH   HH   HH


*/


#define debug


#include "ezw.h"
#include "fifo.h"
#include "list.h"
#include "matrix2d.h"

#include <stdlib.h>
#include <stdio.h>


matrix_2d *M;					//定義工作矩陣
char error;						//定義誤差
FILE *ezw_file;					//已編碼文件
ezw_file_header header;			//文件頭
long int pixels;
long int zeroes, ones;
unsigned char input_byte, mask;


void show_code(int code)
{
  	switch (code)
	{
    	case ZERO:			//如果編碼為ZERO,則輸出為0
   			printf("0");
			break;

		case ONE:			//如果編碼為ONE,則輸出為1
			printf("1");
			break;

		case POS:			//如果編碼為POS,則輸出為p
			printf("p");
			break;

		case NEG:			//如果編碼為NEG,則輸出為n
			printf("n");
			break;

		case ZTR:			//如果編碼為ZTR,則輸出為t
      		printf("t");
    		break;

		case IZ:			//如果編碼為IZ,則輸出為z
      		printf("z");
    		break;
	}
}


//從一個輸入流中讀出一個比特位
char get_bit(void)
{
  	char bit;		//定義讀出的比特位存儲空間
  	if (mask==0) 
  	{
  		//從文件中讀出一個字節,存放在input_byte中
		fread(&input_byte,sizeof(input_byte),1,ezw_file);
  		mask = 0x80;	//最高位標志
  	}
  	//如果讀出字節的最高位為0,則讀出比特位的值為0
	if ((input_byte&mask)==0) 
	{
  		bit = '0';
   		zeroes++;
  	}
	//否則讀出比特位的值為1
  	else
	{
    	bit = '1';
    	ones++;
  	}
	//最高標志位右移一位
	mask >>= 1;
	//返回當前判斷的比特位的值
	return (bit);
}

 
//從一個輸入流中讀出一個編碼字節
int input_code(int count)
{
	switch (get_bit())
	{
		//如果讀出的比特位的值為0
		case '0':
			//假如是讀出字節的最高位,則返回ZERO
    		if (count==1) return (ZERO);
 			//否則,讀取比特位
			else 
			{
 				switch (get_bit()) 
				{
					case '0': return (ZTR);	//如果讀出為0,返回為ZTR
					case '1': return (POS);	//如果讀出為1,返回為POS
        		}
      		}
			break;
		//如果讀出的比特位的值為1
		case '1':
			//假如是讀出字節的最高位,則返回ONE
      		if (count==1) return (ONE);
			//否則,讀取比特位
      		else
			{
				switch (get_bit())
				{
					case '0': return (IZ);	//如果讀出為0,返回為IZ
          			case '1': return (NEG);	//如果讀出為1,返回為NEG
        		}
      		}
    		break;
	}
	//缺省返回值,不可返回
	return 0;
}

 
//利用主表元素和閾值解碼后填充當前矩陣元素
void input_element(matrix_2d *m, element_type t, ezw_element *s)
{
	list_type d;
	d.x = s->x;
	d.y = s->y;
	s->code = input_code(2);

#ifdef debug
	show_code(s->code);
#endif

	if ((s->code==POS)) 
	{
		m->m[s->y][s->x] = t;
		append_to_list(d);
  	}
  	else if ((s->code==NEG))
	{
    	m->m[s->y][s->x] = -t;
    	append_to_list(d);
  	}
}


/*
 * Performs one dominant pass.
 */

void dominant_pass(matrix_2d *m, element_type threshold)
{
  	ezw_element s;
  	int min_x, max_x, min_y, max_y;

	s.x = 0;
	s.y = 0;
	input_element(m,threshold,&s);
	if ((s.code==POS) || (s.code==NEG)) pixels++;

	s.x = 1;
	s.y = 0;
	input_element(m,threshold,&s);
	put_in_fifo(s);
	s.x = 0;
	s.y = 1;
	input_element(m,threshold,&s);
	put_in_fifo(s);
	s.x = 1;
	s.y = 1;
	input_element(m,threshold,&s);
	put_in_fifo(s);

	s = get_from_fifo();
	if (fifo_empty==0)
	{
		if ((s.code==POS) || (s.code==NEG)) pixels++;
  	}

  	while (fifo_empty==0)
	{
  		if (s.code!=ZTR)
		{
     		min_x = s.x << 1;
      		max_x = min_x+1;
      		min_y = s.y << 1;
      		max_y = min_y+1;
      		if ((max_x<=m->col) && (max_y<=m->row))
			{
        		for (s.y=min_y; s.y<=max_y; s.y++)
				{
					for (s.x=min_x; s.x<=max_x; s.x++)
					{
            			input_element(m,threshold,&s);
            			put_in_fifo(s);
          			}
        		}
      		}
    	}
    	s = get_from_fifo();
    	if (fifo_empty==0)
		{
			if ((s.code==POS) || (s.code==NEG)) pixels++;
    	}
	}
}


/*
 * Performs one subordinate pass.
 */
void subordinate_pass(matrix_2d *m, element_type threshold)
{
  	long int i;
  	element_type temp;
  	list_type d;
  	char found;

  	if (threshold>0) 
	{
    	for (i=0; i<pixels; i++)
		{
      		d = get_list_element(i,&found);
      		if (found==1)
			{
        		temp = m->m[d.y][d.x];
        		if (input_code(1)==ONE)
				{
					#ifdef debug
						show_code(ONE);
					#endif
          			if (temp<0)
					{
						m->m[d.y][d.x] = temp - threshold;
          			}
          			else
					{
						m->m[d.y][d.x] = temp + threshold;
          			}
        		}
#ifdef debug
				else show_code(ZERO);
#endif
			}
		}
	}
}
 
//將編碼文件數據解碼存放到工作矩陣m中
void EZW_decode(matrix_2d *m)
{
  	element_type threshold;			//閾值
  	pixels = 0;
  	threshold = header.threshold;
  	//從初始閾值開始知道閾值為0
	while (threshold!=0) 
	{
    	dominant_pass(m,threshold);
    	subordinate_pass(m,threshold >> 1);
    	threshold >>= 1;		//閾值減半
  	}
}
 
//主函數
int main(void)
{
	printf("\n");

	//以二進制只讀模式打開編碼文件
	if ((ezw_file=fopen("out.ezw","rb"))==NULL) 
	{
		printf("Could not open input file.\n");
		exit(1);
  	};
  	//讀文件的頭信息
	fread(&header,sizeof(header),1,ezw_file);

  	//創建一個工作矩陣(給出高和寬)
	M = matrix_2d_create(header.height,header.width);
  	if (M==NULL) exit(1);
  	//矩陣清零
	matrix_2d_clear(M);
	//初始值設置
	zeroes = 0;
	ones = 0;
	input_byte = 0;
	mask = 0;
	//將工作矩陣作為參數,解碼
	EZW_decode(M);

#ifdef debug
 	printf("\n");
	//工作矩陣賦值(寫操作)
	matrix_2d_write(M);
 	printf("%ld bits: %ld zeroes, %ld ones\n", zeroes+ones, zeroes, ones);
#endif

 	//關閉先前的編碼文件
	fclose(ezw_file);
	//釋放工作矩陣占據的存儲空間
 	matrix_2d_destroy(M);
	//釋放主表掃描過程中的臨時數據
 	destroy_fifo();
	//清除零樹掃描過程中的臨時數據
	destroy_list();
	//缺省返回值
 	return 0;
}
1  22
  ---+---|        |
   3 | 4 |  7   8 | 19  20  23  24
  -------+--------|
   9  10 | 13  14 | 25  26  29  30
         |        |
  11  12 | 15  16 | 27  28  31  32
  ----------------+---------------
  33  34   37  38 | 49  50  53  54
                  |
  35  36   39  40 | 51  52  55  56
                  |
  41  42   45  46 | 57  58  61  62
                  |
  43  44   47  48 | 59  60  63  64


Raster scan:
========================

   1 | 2 |  5   6 | 17  18  19  20
  ---+---|        |
   3 | 4 |  7   8 | 21  22  23  24
  -------+--------|
   9  10 | 13  14 | 25  26  27  28
         |        |
  11  12 | 15  16 | 29  30  31  32
  ----------------+---------------
  33  34   35  36 | 49  50  51  52
                  |
  37  38   39  40 | 53  54  55  56
                  |
  41  42   43  44 | 57  58  59  60
                  |
  45  46   47  48 | 61  62  63  64


Subband distribution:
==========================================

  LL | HL | HL   HL | HL   HL   HL   HL
  ---+--- |         |
  LH | HH | HL   HL | HL   HL   HL   HL
  --------+---------|
  LH   LH | HH   HH | HL   HL   HL   HL
          |         |
  LH   LH | HH   HH | HL   HL   HL   HL
  ------------------+------------------
  LH   LH   LH   LH | HH   HH   HH   HH
                    |
  LH   LH   LH   LH | HH   HH   HH   HH
                    |
  LH   LH   LH   LH | HH   HH   HH   HH
                    |
  LH   LH   LH   LH | HH   HH   HH   HH


C. Valens

Created    : 07/09/1999
Last update: 29/09/1999
*/


#define debug


#include "ezw.h"
#include "fifo.h"
#include "list.h"
#include "matrix2d.h"

#include <stdlib.h>
#include <stdio.h>


matrix_2d *M;
char error;
FILE *ezw_file;
ezw_file_header header;
long int pixels;
long int zeroes, ones;
unsigned char input_byte, mask;


void show_code(int code)
{
  switch (code) {
    case ZERO:
      printf("0");
    break;

    case ONE:
      printf("1");
    break;

    case POS:
      printf("p");
    break;

    case NEG:
      printf("n");
    break;

    case ZTR:
      printf("t");
    break;

    case IZ:
      printf("z");
    break;

  }
}


/*
 * Reads a bit from the input stream.
 */
char get_bit(void)
{
  char bit;

  if (mask==0) {
    fread(&input_byte,sizeof(input_byte),1,ezw_file);
    mask = 0x80;
  }

  if ((input_byte&mask)==0) {
    bit = '0';
    zeroes++;
  }
  else {
    bit = '1';
    ones++;
  }

  mask >>= 1;

  return (bit);
}


/*
 * Reads a code from the input stream.
 */
int input_code(int count)
{
  switch (get_bit()) {

    case '0':
      if (count==1) return (ZERO);
      else {
        switch (get_bit()) {
          case '0': return (ZTR);
          case '1': return (POS);
        }
      }
    break;

    case '1':
      if (count==1) return (ONE);
      else {
        switch (get_bit()) {
          case '0': return (IZ);
          case '1': return (NEG);
        }
      }
    break;
  }

  /*
   * You should never get here.
   */
  return 0;
}


/*
 * Builds a matrix element from dominant pass EZW-element and a threshold.
 */
void input_element(matrix_2d *m, element_type t, ezw_element *s)
{
  list_type d;

  d.x = s->x;
  d.y = s->y;
  s->code = input_code(2);

#ifdef debug
  show_code(s->code);
#endif

  if ((s->code==POS)) {
    m->m[s->y][s->x] = t;
    append_to_list(d);
  }
  else if ((s->code==NEG)) {
    m->m[s->y][s->x] = -t;
    append_to_list(d);
  }
}


/*
 * Performs one dominant pass.
 */
void dominant_pass(matrix_2d *m, element_type threshold)
{
  ezw_element s;
  int min_x, max_x, min_y, max_y;

  s.x = 0;
  s.y = 0;
  input_element(m,threshold,&s);
  if ((s.code==POS) || (s.code==NEG)) pixels++;

  s.x = 1;
  s.y = 0;
  input_element(m,threshold,&s);
  put_in_fifo(s);
  s.x = 0;
  s.y = 1;
  input_element(m,threshold,&s);
  put_in_fifo(s);
  s.x = 1;
  s.y = 1;
  input_element(m,threshold,&s);
  put_in_fifo(s);

  s = get_from_fifo();
  if (fifo_empty==0) {
    if ((s.code==POS) || (s.code==NEG)) pixels++;
  }

  while (fifo_empty==0) {
    if (s.code!=ZTR) {
      min_x = s.x << 1;
      max_x = min_x+1;
      min_y = s.y << 1;
      max_y = min_y+1;
      if ((max_x<=m->col) && (max_y<=m->row)) {
        for (s.y=min_y; s.y<=max_y; s.y++) {
          for (s.x=min_x; s.x<=max_x; s.x++) {
            input_element(m,threshold,&s);
            put_in_fifo(s);
          }
        }
      }
    }
    s = get_from_fifo();
    if (fifo_empty==0) {
      if ((s.code==POS) || (s.code==NEG)) pixels++;
    }
  }

}


/*
 * Performs one subordinate pass.
 */
void subordinate_pass(matrix_2d *m, element_type threshold)
{
  long int i;
  element_type temp;
  list_type d;
  char found;

  if (threshold>0) {
    for (i=0; i<pixels; i++) {
      d = get_list_element(i,&found);
      if (found==1) {
        temp = m->m[d.y][d.x];
        if (input_code(1)==ONE) {

#ifdef debug
          show_code(ONE);
#endif
          if (temp<0) {
            m->m[d.y][d.x] = temp - threshold;
          }
          else {
            m->m[d.y][d.x] = temp + threshold;
          }
        }

#ifdef debug
        else show_code(ZERO);
#endif

      }
    }
  }
}


/*
 * EZW-decodes file f into matrix m.
 */
void EZW_decode(matrix_2d *m)
{
  element_type threshold;
  pixels = 0;
  threshold = header.threshold;
  while (threshold!=0) {
    dominant_pass(m,threshold);
    subordinate_pass(m,threshold >> 1);
    threshold >>= 1;
  }
}


/*
 * Main.
 */
//int main(void)
//{
  
//}
int iEZW(void)
{
	printf("\n");

  if ((ezw_file=fopen("out.ezw","rb"))==NULL) {
    printf("Could not open input file.\n");
    exit(1);
  };
  fread(&header,sizeof(header),1,ezw_file);

  M = matrix_2d_create(header.height,header.width);
  if (M==NULL) exit(1);
  matrix_2d_clear(M);

  zeroes = 0;
  ones = 0;
  input_byte = 0;
  mask = 0;
  EZW_decode(M);

#ifdef debug
  printf("\n");
  matrix_2d_write(M);
  printf("%ld bits: %ld zeroes, %ld ones\n", zeroes+ones, zeroes, ones);
#endif

  fclose(ezw_file);
  matrix_2d_destroy(M);
  destroy_fifo();
  destroy_list();

  return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
免费成人在线网站| 久久久久97国产精华液好用吗| 欧美色综合久久| 日韩精品一区二区三区在线| 亚洲一区在线观看免费观看电影高清| 理论电影国产精品| 欧美三级乱人伦电影| 国产精品久久久久天堂| 国产在线看一区| 欧美区视频在线观看| 亚洲免费观看高清完整版在线观看熊| 久久99精品一区二区三区| 欧美午夜片在线看| 国产精品理伦片| 国产91精品免费| 国产亚洲欧洲一区高清在线观看| 日产欧产美韩系列久久99| 在线日韩国产精品| 中文字幕日本不卡| 国产不卡视频在线观看| 日韩欧美第一区| 麻豆91在线看| 日韩区在线观看| 麻豆精品在线观看| 在线综合视频播放| 日韩av网站免费在线| 欧美日韩不卡在线| 日韩影院免费视频| 91精品综合久久久久久| 日韩国产高清在线| 91精品国产综合久久小美女| 午夜精品福利在线| 日韩一区二区在线免费观看| 蜜桃av噜噜一区| 精品处破学生在线二十三| 久久精品国产久精国产爱| 日韩欧美色综合网站| 精品一区二区三区日韩| 日韩欧美中文一区二区| 国产一区二区精品久久99| 久久久久久久久免费| 成人一级片网址| 最新国产成人在线观看| 色综合激情久久| 亚洲18女电影在线观看| 日韩免费视频一区二区| 国产经典欧美精品| 欧美国产亚洲另类动漫| 色综合久久综合中文综合网| 一区二区免费视频| 日韩午夜激情免费电影| 狠狠色丁香婷婷综合久久片| 国产精品午夜在线| 在线亚洲一区观看| 美洲天堂一区二卡三卡四卡视频| 久久看人人爽人人| 99久久99久久精品免费看蜜桃| 一级精品视频在线观看宜春院| 欧美一区二区三区在| 成人性色生活片| 午夜精品久久久久久久99樱桃| 欧美mv日韩mv国产网站app| youjizz国产精品| 日韩电影免费在线观看网站| 久久网站热最新地址| 色综合咪咪久久| 极品少妇xxxx偷拍精品少妇| 国产精品福利一区二区| 91.麻豆视频| 成人av综合在线| 天堂蜜桃91精品| 国产精品传媒视频| 精品日产卡一卡二卡麻豆| 91麻豆.com| 国产乱子轮精品视频| 亚洲自拍偷拍九九九| 欧美极品少妇xxxxⅹ高跟鞋 | 亚洲国产综合在线| 久久久九九九九| 欧美日韩一级视频| jizz一区二区| 国产一区二区电影| 日本欧美一区二区在线观看| 国产精品情趣视频| 精品va天堂亚洲国产| 欧美午夜宅男影院| 成人av资源站| 国产精品自在欧美一区| 日韩成人伦理电影在线观看| 亚洲女性喷水在线观看一区| 久久婷婷综合激情| 欧美成人官网二区| 欧美日韩精品一区二区| 99热精品国产| 高清久久久久久| 国产一区二区三区久久悠悠色av| 亚洲不卡一区二区三区| 亚洲免费成人av| 国产精品欧美一区二区三区| 久久女同精品一区二区| 欧美成人一区二区| 欧美一区二区精美| 欧美日韩中字一区| 欧美在线不卡一区| 欧美中文字幕一区二区三区 | 欧美一区二区三区视频| 色悠悠久久综合| 99久久久无码国产精品| 丁香啪啪综合成人亚洲小说| 国产精品中文欧美| 国精品**一区二区三区在线蜜桃| 男女激情视频一区| 污片在线观看一区二区| 日韩精品久久理论片| 日本女人一区二区三区| 蜜臀国产一区二区三区在线播放| 日本不卡在线视频| 久久精品久久久精品美女| 久久99精品国产麻豆不卡| 另类欧美日韩国产在线| 久久99久久精品| 国产高清精品久久久久| 99视频超级精品| 欧美在线影院一区二区| 欧美视频一区二区三区在线观看| 欧美日韩在线播放三区| 欧美日韩一本到| 欧美成人性战久久| 久久精品视频一区二区| 欧美激情一区二区三区| 136国产福利精品导航| 一区二区三区免费| 免费观看一级特黄欧美大片| 国产在线精品一区二区| av中文字幕在线不卡| 一本一道久久a久久精品| 欧美精品自拍偷拍| 久久精子c满五个校花| 亚洲黄色片在线观看| 同产精品九九九| 国产精品自在欧美一区| 91麻豆6部合集magnet| 欧美一区二区免费视频| 国产婷婷色一区二区三区四区 | 欧美伊人久久久久久久久影院 | 91精选在线观看| 国产日产欧美一区二区视频| 一区二区成人在线| 理论片日本一区| a亚洲天堂av| 日韩欧美的一区二区| 中文字幕在线不卡一区| 日韩av电影一区| 波多野结衣亚洲| 日韩欧美你懂的| 亚洲日穴在线视频| 精品在线免费观看| 色香色香欲天天天影视综合网| 欧美一区二区在线免费播放 | jiyouzz国产精品久久| 91麻豆精品国产91久久久更新时间 | 国产精品久久久久影院色老大| 午夜视频在线观看一区二区三区 | 91福利精品第一导航| 久久久久高清精品| 亚洲成av人在线观看| 顶级嫩模精品视频在线看| 欧美肥妇毛茸茸| 一区二区三区四区视频精品免费 | 精品成人a区在线观看| 亚洲在线视频免费观看| 成人性生交大片免费看中文 | 欧美电影在线免费观看| 国产精品美女久久久久久久网站| 婷婷亚洲久悠悠色悠在线播放| 成年人网站91| 久久久久久毛片| 美美哒免费高清在线观看视频一区二区 | 不卡的看片网站| 精品少妇一区二区三区免费观看| 亚洲精品欧美专区| 成人精品免费看| 国产欧美日韩在线看| 国精产品一区一区三区mba桃花| 欧美日韩在线电影| 一区二区在线看| 91麻豆自制传媒国产之光| 国产精品美女久久福利网站| 国产一区二区免费看| 精品欧美一区二区久久| 免费的成人av| 欧美va亚洲va香蕉在线| 久久精品国产99国产| 欧美一区二区三区四区高清| 午夜精品影院在线观看| 欧美日韩精品欧美日韩精品一综合| 亚洲精品高清在线观看| 99在线精品观看| 一区二区三区中文在线观看| 欧美在线短视频|