画像可変ストロークの混乱コード

18796 ワード

画像可変ストロークの混乱コード

  • 画像可変行程の混乱符号化
  • 可変行程符号化(VLC)
  • 混乱符号
  • 参照コード
  • 画像可変ストロークの混乱符号化


    ここでは、私の自画像コードについて簡単に説明します.自画像コードは実際にはデコーダです.2つのセクションがあります.
  • 画像の可変行程符号化(varied length coding)
  • 混乱符号化(obfuscated coding)の最も重要な部分はその符号表である.ここでは、可変ストロークの混乱符号化後のコードテーブルを生成する方法について説明します.

  • 可変行程符号化(VLC)


    実際、私の自画像は簡単なコースコードを採用しています.その基本原理は以下の通りである.
  • は最も簡単な2値画像の行程符号化を採用し、交互数0,1の個数
  • を必要とする.
  • 偶数バイトは0の長さを表し、奇数バイトは1の長さ
  • を表す.
  • がASCIIコードの文字で長さを表す場合、実際のバイトは元の長さ符号化ではなく、0または1の長さに対応する文字
  • を表示することができる.

    混乱符号化


    前節ではVLC符号化方法について説明したが、1バイトあたりの表現長さが限られている(選択可能な表示可能文字が限られているため)という問題があった.Mと仮定した.0の長さL(L>M)の符号化を例にとると、VLCパリティがそれぞれ符号化されているため、LがMを超えるため、まずMの長さの偶数文字を1つ、次に0の長さの奇数文字を1つ、次に(L−M)の偶数文字を1つとする.なお,長さ0を表す文字は,複数の文字からランダムに選択できることが混乱符号化の由来である.

    リファレンスコード


    2値bmp画像の可変ストロークの混乱符号化後の文字テーブルを以下のエンコーダで簡単に生成することができる.
    int gen_bmp_2bit_vlc_tbl(char *img, FILE *fp) {
    	int  i, j, k;
    	int  idx;
    	int  cnt_bit_flag; // 0: count bit 0 run-length; 1: count bit 1 run-length
    	int  force_cnt_bit_flag;
    	int  bits_1, bits_0;
    	int  max_run_length;
    	unsigned char c[16];
    	
    	// at first, count bit 0
    	cnt_bit_flag = 0;
    	bits_0 = 0;
    	bits_1 = 0;
    	max_run_length = 0;
    	force_cnt_bit_flag = FORCE_DONE;
    	idx = 0;
    	for (i=0; i<H; i++) {
    		fseek(fp, -(i+1)*W/8, SEEK_END);
    		fread(&c, sizeof(unsigned char), W/8, fp);
    		for (j=0; j<W/8; j++) {
    			for (k = 0; k < 8; k++) {
    				if (force_cnt_bit_flag == FORCE_0) {
    					cnt_bit_flag = 0;
    					assert(bits_1 > 0);
    					printf("%c", img[idx++] = bits_1 + MIN_ASCII);
    					if (bits_1 > max_run_length)
    						max_run_length = bits_1;
    					bits_1 = 0;
    					force_cnt_bit_flag = FORCE_DONE;
    					bits_0 = 0;
    				}
    				else if (force_cnt_bit_flag == FORCE_1) {
    					cnt_bit_flag = 1;
    					assert(bits_0 > 0);
    					printf("%c", img[idx++] = bits_0 + MIN_ASCII);
    					if (bits_0 > max_run_length)
    						max_run_length = bits_0;
    					bits_0 = 0;
    					force_cnt_bit_flag = FORCE_DONE;
    					bits_1 = 0;
    				}
    
    				if (c[j] & 0x80) {
    					if (cnt_bit_flag == 0) {
    						cnt_bit_flag = 1;
    						if (bits_0 <= 0)
    							printf("%c", img[idx++] = (rand() % (MIN_ASCII - OBF_ASCII + 1) + OBF_ASCII));
    						else
    							printf("%c", img[idx++] = bits_0 + MIN_ASCII);
    						if (bits_0 > max_run_length)
    							max_run_length = bits_0;
    						bits_0 = 0;
    					}
    					bits_1++;
    					if (bits_1 >= MAX_RUN_LENGTH) {
    						// force change
    						force_cnt_bit_flag = FORCE_0;
    					}
    				}
    				else {
    					if (cnt_bit_flag == 1) {
    						cnt_bit_flag = 0;
    						if (bits_1 <= 0)
    							printf("%c", img[idx++] = (rand() % (MIN_ASCII - OBF_ASCII + 1) + OBF_ASCII));
    						else
    							printf("%c", img[idx++] = bits_1+MIN_ASCII);
    						if (bits_1 > max_run_length)
    							max_run_length = bits_1;
    						bits_1 = 0;
    					}
    					bits_0++;
    					if (bits_0 >= MAX_RUN_LENGTH) {
    						// force change
    						force_cnt_bit_flag = 1;
    					}
    				}
    				c[j] = c[j] << 1;
    			}
    		}		
    	}
    	// force the last out
    	if (bits_0 != 0) {
    		printf("%c
    "
    , img[idx++] = bits_0 + MIN_ASCII); if (bits_0 > max_run_length) max_run_length = bits_0; bits_0 = 0; } else if (bits_1 != 0) { printf("%c
    "
    , img[idx++] = bits_1 + MIN_ASCII); if (bits_1 > max_run_length) max_run_length = bits_1; bits_1 = 0; } return idx; }