もっとも単純なランレングス圧縮
の編集
http://ehime-csr-new.sakura.ne.jp/csr/index.php?%E3%82%82%E3%81%A3%E3%81%A8%E3%82%82%E5%8D%98%E7%B4%94%E3%81%AA%E3%83%A9%E3%83%B3%E3%83%AC%E3%83%B3%E3%82%B0%E3%82%B9%E5%9C%A7%E7%B8%AE
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(゜∀゜)
2007/04/01トップページ
2013年末うどんどんツアー
2013春合宿企画
ARK
ASP.NETを使って1行もコーディングせずに作る蔵書管理システム
AVRマイコンなページ
BracketName
C++STL解説
C++STL解説 part01 コンテナ
C.S.R.
C.S.R. OB会のページ
C.S.R. Wiki トップページ
C.S.R.%20Wiki%20%E3%83%88%E3%83%83%E3%83%97%E3%83%9A%E3%83%BC%E3%82%B8
C.S.R.の歴史
C.S.Rゲーム強化週間
CSRオリジナルパーカーをつくろう
CSRプログラミングコンテスト
CSRプロコン第1回
CSRポケモン大会
CSR海外旅行
CSR週末卓ゲー部(TRPG)
CSharp講座
CSharp講座第一回
CSharp講座第三回
CSharp講座第二回
CSharp講座第五回
CSharp講座第四回
C言語における文字列の扱いについて
C言語講座
C言語講座第ニ回
C言語講座第ニ回課題
C言語講座第一回
C言語講座第七回
C言語講座第三回
C言語講座第三回演習
C言語講座第三回演習 解答例
C言語講座第二回 解答例
C言語講座第五回
C言語講座第五回演習
C言語講座第六回
C言語講座第六回演習
C言語講座第六回演習 解答例
C言語講座第四回
D.T.M.
EJBの作成
Eclipseのインストール
Entityの作成
FAQ
FAST
FTP
FizzBuzz
FormatRule
FormattingRules
FrontPage
GlassFish(Ubuntu)
GlassFishの設定
HEAVENS KITCHEN
HIKKY_J
Hawke
Help
IRC
IS01のページ
InterWiki
InterWikiName
InterWikiSandBox
InterWikiテクニカル
JSF-Ajax
JSF-Faceletsの作成
JSF-ManagedBeanの作成
Java
Java EE
Java EEのプロジェクト
Java EEの開発環境
Java EEアプリケーションの実行
Java(Ubuntu)
Java2SDKのインストール
Jupe
KOUJI
KWGJ9
KY cafe
Kuma
LIC
Ledah
Link
Low
MARIKO
MIZUKAZE
Marishi Bank
Marishi Co. Ltd.
MenuBar
Merry X'mas
MySQL
MySQL(Ubuntu)
NAO
NAOのおしえてP・I・C(ぴーあいしー)
NOMAD
Nabe
NetBeansからMySQLに接続
NetBeansでHelloWorld
OB一覧
OpenCV
PCデポ
PHP
Plamo
Processing講座
Processing講座 第一回
Processing講座 第三回
Processing講座 第二回
Processing講座 第五回
Processing講座 第六回
Processing講座 第四回
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
QRコード
RecentDeleted
Rogi
Rupy
SEN
SandBox
Subversionのすすめ
TOM
TechTalk
TechTalk 運営委員会
Test
Toku
T村氏
UDとは?
UD導入ガイド
URALU
Ubuntu(VirtualBox)
VB-オブジェクトのプロパティ
Velxot
VirtualBox
WEB担当の仕事の仕方まとめ
WikiEngines
WikiName
WikiWikiWeb
Wikiって何?
XONY
Y
Yama
YukiWiki
ZECHS
appli
formula
ika
inatyu
iqm
iアプリエミュレータのインストール
justice
kei.K
kepa
maeda
misaki
mojyack(仮)
msnメッセンジャーを使おう
neko
newsky
nginx(Ubuntu)
rariru
rian
s-cat
skipjack
taka
takuto
tano
tanoさんbot
tetra
twitterをはじめよう
uraluさんbot
winbrem
zawawa
zoo
…
あっぴり
あるけい
いろはす
うえさん
うずしお
おかま
おかゆ
おっさん化現象
おんまく寿司
お店
お湯
お知らせ
お花見
かいりょう
かきべえ
かつてないほどてきとーなにくにく
かとそ
かなめ
かまどや
かんきつ
かんきつの好きな曲
がじら
がっきー
がんば亭
くら寿司
ぐぴー
ころん
こんちゃん
さくら
さらし孤
さらし狐
しおかぜ
しおかぜ旅行まとめ
しおかぜ98号
しゃどう
しゃも
じゃんけん(JSF)
すき家
すずっち
すぽんじ
ずんだくん
そのほかの人たち
たおる
たけぞう
だんだん茶屋
ちかさん
つぼ八
つむ
とあるけみすと
とある宴の酒池肉林
とっくん
ともぴー
とらねこ
とりかわ
どーなつ先輩の亡骸.JPG
なかじ
なめくじ
にくにく
にくにくテンプレfor幹事さん
にたも
にゃおぬあ
にゃー
はぃから亭
はいから亭
はいから亭 メニュー.txt
はいから邸
はかいり亭
はだかの王様
はにわ
はま寿司
はゐから亭
ひーこー
ふよごい
ぷりちーなマリシきゅんと何かしよう2008
ほいから亭
ほっかほっか亭
ほっともっと
まぁ
まっつん
まつい
まつい(仮)
まぴょそ
まりしきゅんのおうち
みったん
むしくん
もっとも単純なランレングス圧縮
もな
ゆめタウン
ゆーゆ
ゆーろー
よしすけ
よーむ
よーむ → MY
りふれ
ろぎ
ろくめいかん
わかば
わっさ家
ゑくれあ
アクアパッツァ大会
アザミ
アプライド
アラバスタ
アリオ倉敷
アルミ−
アーカイブ
イオン
イオンモール倉敷
イオンモール岡山
イチ
イブソン
イベント
エディオン
エミフルMASAKI
エルノーツ
エンケラドス
オッパオ
カシテル
カチコール
カーくん
ガスト
キャデン
キリン
クラスタ(GlassFish)
クロミル
ケンタッキー
ケーズデンキ
ゲーム一覧
ゲーム製作集会
ココス
コジマ
コメント/TechTalk
コメント/inatyu
コンパス
サークルK
ジュエリー・F・スミス
スカイ
スシロー
スマブラ大会
スライドパズル(JSF)
スーパー日東
セブンイレブン
セレイン
センチュリオン
タイマーに関係するレジスタ
タイマー・PWM
タックス
タマノ
タワーディフェンス リリィガーディアン
ダムダム Dame dam
ツゾ
テンプレート
ディスプレイ
デオデオ
デスラー
データ圧縮
ドスパラ
ドン・キホーテ
ニートの日
ネット
ハィカラ亭
ハイカラ亭
ハイ力ラ亭
ハッカソン的なものを企画したい。
バルサン
バースデイきっぷ
パイン
パクパク
パソコン講習
パソ工
パムパムくん
ビアガーデン
ファミリーマート
フク
フジ
フジグラン
プラグインのテスト
プラス
プログラミング
プログラム講習会
プーの森
ヘルプ
ベスト電器
ペンペンについて
マイコン勉強会
マクドナルド
マサ
マッキー
ママピス
マリシ
マリシとNAOのネット界の超時空スーパーアイドル(笑)を目指すページ
マリシライナー
マリシ容疑者(ジョーク)
ミカン
ミスタードーナツ
ミニクイズ(JSF)
メーリングリスト
モスバーガー
ヤマダ電機
ヤムキン
ユウ
ユウメ
ユースケ・サンタ
ラジオ会館
ラピュタガーデン
ランレングス圧縮
リズム天国(parody)
リッチドーナツ
リヨ
レイジ
ロッテリア
ロボット講座
ローグライクゲームを作ろう
ローゼ
ローソン
ローソン(コンビニ)
ワングー
ワールドキッチン
ヴィロット
一天張
一気コール
七厘や本店
七面鳥ぅ
万帳
両津
之達磨
企画/CSR Blog Rally
企画まとめ
個人で購入すべきパーツ
元帥
入力の使い方
入部希望の皆様へ
冷蔵庫
処分予定の雑誌リスト
初級シスアド
勝山協食
半塩
卒業生追い出しコンパ
協同ゲーム制作
単位取ったら負けかなと思ってる
単位取得率
合宿
合宿 2010/9
吉野家
喫茶マウンテンを現地指導
四国再発見きっぷネットワーク
四国再発見きっぷネットワーク(β)
四川飯店
回数券をみんなでわけて使おう
図書館のグループ学習室
圧縮を行うプログラムをつくるところについて思う所
坊ちゃん
坐・和民
埋蔵金
基数ソート
夏合宿
夏合宿の反省点2013
多恋人(だれと)
大宇宙拡大大帝国絶対永久皇帝大帝国大元帥★
大街道
大街道歯科
大阪行き移動案
学生祭2009
学生祭2012
学生祭2013
学生祭2014
学生祭2015
学生祭2016
学生祭2017
学祭
学祭2008まとめ
学祭2010
学祭2010作品
学祭2011作品
学祭2012作品
学祭2013作品
学祭2014作品
学祭2015作品
学祭2016作品
学祭2017作品
学祭用電光掲示板をつくろーの会
学際2011
宇和島の美味しいもの巡り旅
安価に旅行
定期購読雑誌
山田
島根県
市駅
幹部のおしごと
幻の春合宿
庄屋
忘年会
忠孝
情報処理技術者試験
情報処理試験
愛媛大学
手作業でやってみるエラトステネスの篩
振り子式車両傾斜角度計算
整形ルール
新入生M
新入生歓迎コンパ
新入生歓迎合宿
新勧ビラ-2009- 作成黒歴史
新年会
旅に出よう
明治ブルガリアヨーグルト
映画化アニメに対する一般人の認識
時間割表のひな形
晴れたり曇ったり
書式文字列について
書籍購入
村さ来大街道店
村さ来本店
松屋
松山−伊予上灘の時刻表
松山−大阪間の移動手段についての考察
松山市駅
松山駅
柚木
栗林公園
業務スーパー
歴代の役員
毀襲
汚物
沢庵
海洋堂ホビー館への旅
清まる
漣
炉談
焼きプリン
生協食堂
白木屋
白虎
神崎
簡易BBS
簡易BBS・過去ログ1
簡易BBS・過去ログ2
簡易BBS・過去ログ3
簡易BBS・過去ログ4
簡易BBS・過去ログ5
簡易BBS・過去ログ6
簡易BBS・過去ログ7
簡易BBS・過去ログ8
簡易BBS・過去ログ9
粋人
純歩
翔
能三食堂
自宅警備イン
自宅警備基金
自宅警備委員会
花いちもんめ
萬楽塩田屋
西条ビール工場・四国鉄道文化館の旅
要出典
説明会
講座一覧
讃岐うどんツアー
讃岐うどんツアー(高松市内コース)
豆蔵
資格をとろう
資格をとろう2006
軍曹
連絡船うどん
部則
部品のページ
部員のMSNアドレス
部員一覧
金曜日
銀
銀天街
鍵当番
関数ポインタ
青めがね
A.
JR栗林駅
O
SLやまぐち号と津和野
64
**1.圧縮の原理 [#e7f0ea57] ~ 原理は単純でデータが連続で続いていたら、そやつらを符号化するだけです。~ #ref("./gazou1.jpg",70%);~ ~ ここで注意しておきたいのはデータが連続しないときも符号をつかないといけないということです。~ でないとプログラム側がデータか符号かがわかりませんから。~ つまりこの圧縮方法だとよほどデータが連続してないと圧縮前よりデータ量が増えてしまうということです。~ これは次回に解消します。~ ~ ~ **2.解凍の原理 [#s09e0873] ~ 符号どうりにデータを展開します。~ ~ ~ **3.圧縮結果 [#b9489437] 1.ACジャパン あいさつの魔法.mp3 1.15MB → 2.21MB 圧縮率191.69% 増えた!~ ~ 2.[[はいから亭 メニュー.txt]] 1.86KB → 3.68KB 圧縮率198.11% 増えた!~ ~ 3.[[どーなつ先輩の亡骸.JPG]] 595KB → 1.14MB 圧縮率196.82% 増えた!~ ~ 4.どーなつ先輩の亡骸.bmp 256色 3.23MB → 699KB 圧縮率21.10% ~ 5.どーなつ先輩の亡骸.bmp 16色 1.61MB → 136KB 圧縮率5.89% ~ 5.どーなつ先輩の亡骸.bmp 白黒 417KB → 40.4KB 圧縮率9.69% ~ ***総評 [#ka87ba28] 普通のデータでは連続しているデータは少なく、連続していない場合符号化の時点で1byteが2byteぶんのデータサイズになるのでほぼ2倍のデータ量になります。~ 画像ファイルで白黒より16色のほうが圧縮率がいいのは白黒ではデータが連続し過ぎているというのがひとつの理由です。~ あるデータが何回続くのかを1byteで記録しているので255回の連続までしか記録できません。~ また白黒は文字通り白と黒しかありませんから1ドットを1bitで表現できます。~ これを利用するとさらに圧縮率が高まります。~ ~ ~ **Sample [#w618d0d2] ~ ~ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> #define EXP_DATA 0 #define EXP_SYMBOL 1 void RLECompressFile(char *read_file_name); void RLEDecompressFile(char *read_file_name); int main(int argc, char *argv[]) { int input; //コマンドライン引数の例外 if((argc - 1) != 1) { printf("ファイルを指定してください\n"); return 0; } //圧縮or解凍 do { printf("圧縮→'c' 解凍→'t' 終了→'q'\n"); input = getch(); switch(input) { case 'c': printf("ファイルを圧縮します\n\n"); printf("%s\n", argv[1]); RLECompressFile(argv[1]); break; case 't': printf("ファイルを解凍します\n"); printf("%s\n", argv[1]); RLEDecompressFile(argv[1]); break; case 'q': printf("終了します\n"); return 0; default: printf("もう一度入力してください\n"); } }while((input != 'c') && input != 't'); return 0; } //ファイルを圧縮する関数 //引数1:ファイルの名前 void RLECompressFile(char *read_file_name) { FILE *read_fp; FILE *write_fp; fpos_t rfile_size = 0; fpos_t wfile_size = 0; fpos_t file_pos = 0; unsigned char *read_data; unsigned char write_data[2]; //write_data[0] → データ write_data[1] → 何回続くか fpos_t i; unsigned char equ_counter = 1; char write_file_name[_MAX_PATH]; //読み込みファイル if((read_fp = fopen(read_file_name, "rb")) == NULL) { printf("ファイルが開けません(read)\n"); exit(0); } //新規ファイル strcpy(write_file_name, read_file_name); strcat(write_file_name, ".rrr"); //拡張子をrrrに if((write_fp = fopen(write_file_name, "wb")) == NULL) { printf("ファイルが開けません(write)\n"); exit(0); } //ファイルサイズ取得 file_pos = fseek(read_fp, 0, SEEK_END); fgetpos(read_fp, &rfile_size); fseek(read_fp, file_pos, SEEK_SET); printf("圧縮前 %dbyte\n", rfile_size); //メモリ確保 read_data = (unsigned char*)malloc(rfile_size); //読み込み fread(read_data, sizeof(unsigned char), rfile_size, read_fp); //圧縮と書き込み for(i = 1; i < rfile_size + 1; i++) { for(equ_counter = 1; equ_counter < 256; equ_counter++) { if(read_data[i] == read_data[i - 1]) { i++; continue; }else { break; } } write_data[EXP_DATA] = read_data[i - 1]; write_data[EXP_SYMBOL] = equ_counter; fwrite(write_data, sizeof(unsigned char), 2, write_fp); } fgetpos(write_fp, &wfile_size); printf("圧縮後 %dbyte\n", wfile_size); printf("圧縮率 %f%%\n\n", ((float)wfile_size / (float)rfile_size) * 100.0); fclose(read_fp); fclose(write_fp); free(read_data); } //ファイルを解凍する関数 //引数1:ファイルの名前 void RLEDecompressFile(char *read_file_name) { FILE *read_fp; FILE *write_fp; fpos_t rfile_size = 0; fpos_t wfile_size = 0; fpos_t file_pos = 0; unsigned char *read_data; fpos_t i, j; unsigned char equ_counter = 1; char write_file_name[_MAX_PATH]; //読み込みファイル if((read_fp = fopen(read_file_name, "rb")) == NULL) { printf("ファイルが開けません(read)\n"); exit(0); } //新規ファイル strcpy(write_file_name, read_file_name); write_file_name[strlen(write_file_name) - 4] = '\0'; if((write_fp = fopen(write_file_name, "wb")) == NULL) { printf("ファイルが開けません(write)\n"); exit(0); } //ファイルサイズ取得 file_pos = fseek(read_fp, 0, SEEK_END); fgetpos(read_fp, &rfile_size); fseek(read_fp, file_pos, SEEK_SET); //メモリ確保 read_data = (unsigned char*)malloc(rfile_size); //読み込み fread(read_data, sizeof(unsigned char), rfile_size, read_fp); //解答と書き込み for(i = 0; i < rfile_size; i += 2) { for(j = 0; j < read_data[i + 1]; j++) { fwrite(&read_data[i], sizeof(char), 1, write_fp); } } fclose(read_fp); fclose(write_fp); free(read_data); }
タイムスタンプを変更しない
**1.圧縮の原理 [#e7f0ea57] ~ 原理は単純でデータが連続で続いていたら、そやつらを符号化するだけです。~ #ref("./gazou1.jpg",70%);~ ~ ここで注意しておきたいのはデータが連続しないときも符号をつかないといけないということです。~ でないとプログラム側がデータか符号かがわかりませんから。~ つまりこの圧縮方法だとよほどデータが連続してないと圧縮前よりデータ量が増えてしまうということです。~ これは次回に解消します。~ ~ ~ **2.解凍の原理 [#s09e0873] ~ 符号どうりにデータを展開します。~ ~ ~ **3.圧縮結果 [#b9489437] 1.ACジャパン あいさつの魔法.mp3 1.15MB → 2.21MB 圧縮率191.69% 増えた!~ ~ 2.[[はいから亭 メニュー.txt]] 1.86KB → 3.68KB 圧縮率198.11% 増えた!~ ~ 3.[[どーなつ先輩の亡骸.JPG]] 595KB → 1.14MB 圧縮率196.82% 増えた!~ ~ 4.どーなつ先輩の亡骸.bmp 256色 3.23MB → 699KB 圧縮率21.10% ~ 5.どーなつ先輩の亡骸.bmp 16色 1.61MB → 136KB 圧縮率5.89% ~ 5.どーなつ先輩の亡骸.bmp 白黒 417KB → 40.4KB 圧縮率9.69% ~ ***総評 [#ka87ba28] 普通のデータでは連続しているデータは少なく、連続していない場合符号化の時点で1byteが2byteぶんのデータサイズになるのでほぼ2倍のデータ量になります。~ 画像ファイルで白黒より16色のほうが圧縮率がいいのは白黒ではデータが連続し過ぎているというのがひとつの理由です。~ あるデータが何回続くのかを1byteで記録しているので255回の連続までしか記録できません。~ また白黒は文字通り白と黒しかありませんから1ドットを1bitで表現できます。~ これを利用するとさらに圧縮率が高まります。~ ~ ~ **Sample [#w618d0d2] ~ ~ #include<stdio.h> #include<stdlib.h> #include<conio.h> #include<string.h> #define EXP_DATA 0 #define EXP_SYMBOL 1 void RLECompressFile(char *read_file_name); void RLEDecompressFile(char *read_file_name); int main(int argc, char *argv[]) { int input; //コマンドライン引数の例外 if((argc - 1) != 1) { printf("ファイルを指定してください\n"); return 0; } //圧縮or解凍 do { printf("圧縮→'c' 解凍→'t' 終了→'q'\n"); input = getch(); switch(input) { case 'c': printf("ファイルを圧縮します\n\n"); printf("%s\n", argv[1]); RLECompressFile(argv[1]); break; case 't': printf("ファイルを解凍します\n"); printf("%s\n", argv[1]); RLEDecompressFile(argv[1]); break; case 'q': printf("終了します\n"); return 0; default: printf("もう一度入力してください\n"); } }while((input != 'c') && input != 't'); return 0; } //ファイルを圧縮する関数 //引数1:ファイルの名前 void RLECompressFile(char *read_file_name) { FILE *read_fp; FILE *write_fp; fpos_t rfile_size = 0; fpos_t wfile_size = 0; fpos_t file_pos = 0; unsigned char *read_data; unsigned char write_data[2]; //write_data[0] → データ write_data[1] → 何回続くか fpos_t i; unsigned char equ_counter = 1; char write_file_name[_MAX_PATH]; //読み込みファイル if((read_fp = fopen(read_file_name, "rb")) == NULL) { printf("ファイルが開けません(read)\n"); exit(0); } //新規ファイル strcpy(write_file_name, read_file_name); strcat(write_file_name, ".rrr"); //拡張子をrrrに if((write_fp = fopen(write_file_name, "wb")) == NULL) { printf("ファイルが開けません(write)\n"); exit(0); } //ファイルサイズ取得 file_pos = fseek(read_fp, 0, SEEK_END); fgetpos(read_fp, &rfile_size); fseek(read_fp, file_pos, SEEK_SET); printf("圧縮前 %dbyte\n", rfile_size); //メモリ確保 read_data = (unsigned char*)malloc(rfile_size); //読み込み fread(read_data, sizeof(unsigned char), rfile_size, read_fp); //圧縮と書き込み for(i = 1; i < rfile_size + 1; i++) { for(equ_counter = 1; equ_counter < 256; equ_counter++) { if(read_data[i] == read_data[i - 1]) { i++; continue; }else { break; } } write_data[EXP_DATA] = read_data[i - 1]; write_data[EXP_SYMBOL] = equ_counter; fwrite(write_data, sizeof(unsigned char), 2, write_fp); } fgetpos(write_fp, &wfile_size); printf("圧縮後 %dbyte\n", wfile_size); printf("圧縮率 %f%%\n\n", ((float)wfile_size / (float)rfile_size) * 100.0); fclose(read_fp); fclose(write_fp); free(read_data); } //ファイルを解凍する関数 //引数1:ファイルの名前 void RLEDecompressFile(char *read_file_name) { FILE *read_fp; FILE *write_fp; fpos_t rfile_size = 0; fpos_t wfile_size = 0; fpos_t file_pos = 0; unsigned char *read_data; fpos_t i, j; unsigned char equ_counter = 1; char write_file_name[_MAX_PATH]; //読み込みファイル if((read_fp = fopen(read_file_name, "rb")) == NULL) { printf("ファイルが開けません(read)\n"); exit(0); } //新規ファイル strcpy(write_file_name, read_file_name); write_file_name[strlen(write_file_name) - 4] = '\0'; if((write_fp = fopen(write_file_name, "wb")) == NULL) { printf("ファイルが開けません(write)\n"); exit(0); } //ファイルサイズ取得 file_pos = fseek(read_fp, 0, SEEK_END); fgetpos(read_fp, &rfile_size); fseek(read_fp, file_pos, SEEK_SET); //メモリ確保 read_data = (unsigned char*)malloc(rfile_size); //読み込み fread(read_data, sizeof(unsigned char), rfile_size, read_fp); //解答と書き込み for(i = 0; i < rfile_size; i += 2) { for(j = 0; j < read_data[i + 1]; j++) { fwrite(&read_data[i], sizeof(char), 1, write_fp); } } fclose(read_fp); fclose(write_fp); free(read_data); }
テキスト整形のルールを表示する