画像可変ストロークの混乱コード
18796 ワード
画像可変ストロークの混乱コード
画像可変ストロークの混乱符号化
ここでは、私の自画像コードについて簡単に説明します.自画像コードは実際にはデコーダです.2つのセクションがあります.
可変行程符号化(VLC)
実際、私の自画像は簡単なコースコードを採用しています.その基本原理は以下の通りである.
混乱符号化
前節では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;
}