プチコン3号&BIGまとめWiki

投稿プログラム : SRD画像圧縮ライブラリ

パンくずリスト

2022年5月27日投稿 / 2022年6月10日更新 / 投稿者 : あまさとしおん(天郷思音) / タグ : 投稿プログラム 実用ツール ライブラリ 圧縮

検索用:【天郷思音】

概要

展開の速さと圧縮率のバランスが特徴の画像圧縮ライブラリです。

圧縮率の目安

ピクセルあたり約1~4bit(多くの場合は2.5~3.5bit)
(写真など極端に色数が多い画像は、これより大きくなります)

SYS/DEFSP.GRPの切り抜き(512×128)を保存した場合、配列サイズは26,328バイト
ピクセルあたり約3.22bit、配列からの読み込み時間は約244ミリ秒です。

  • 処理時間はNew3DSで計っています。無印3DSではこの3倍が目安です。
  • ファイルに読み書きする場合、読み込み時間はこれより増加します。

使い方

スロット0で実行すると自動的に動作確認モードになります。
ライブラリとして使う場合はスロット1~3にEXECしてください。

コピペして使う場合はプログラム中の
'*** コピーしてつかうとき ここから ***
'*** コピーしてつかうとき ここまで ***
の範囲だけコピーしてください。

命令の使い方は下記の通りです。

ライブラリの初期化

初期化時にCLSが実行されるので、プログラムの初期化段階で使うことを推奨します。

  1. EXEC ”PRGx:SRDLIB.PRG”

(xは1~3のスロット番号)

ファイルとして書き込み

  1. SRDSAVEFILE x,y,w,h,”DAT:filename”
  2. ’↓処理時間を気にする場合
  3. SRDSAVEFILEQ x,y,w,h,”DAT:filename”

(xは始点X座標、yは始点Y座標、wは幅、hは高さ)

セーブは複数の圧縮パターンを試して一番圧縮できたものを保存します。
処理時間を気にする場合はSRDSAVEFILEQ命令を使ってください。
(比較を省略し固定形式*1で保存します。圧縮率が少し悪くなる場合があります。)

ファイルから読み込み

  1. SRDLOADFILE x,y,”DAT:filename”
  2. ’↓簡易コンペア機能を使う場合
  3. SRDLOADFILECS x,y,”DAT:filename”

(xは始点X座標、yは始点Y座標)
SRDLOADFILECS命令は、読み込んだ画像のチェックサムが一致しないとき、ダイアログでエラーを表示します。
チェックサムは追加圧縮済みのデータにのみ含まれます。
(SAVEFILEQ命令や頻度圧縮オプションありでセーブしたデータは確認できません)

オプションの有効化

  1. SRDMORECOMP #TRUE

このコマンドは廃止されました。

更新情報

バージョン間の後方互換は作品ページを作成した日から考慮していますので、5/27までの古いバージョンで保存したデータは最新バージョンで読み込みが可能です。

2022/06/10更新

  • いくつかの変数名を変更した。
  • 追加圧縮で未使用だった符号領域を活用して辞書の範囲を拡大*2した。
    • 展開処理に掛かる時間はそのままで、わずかに圧縮率を改善しました。

2022/06/09更新

  • 不必要な変数宣言を削除した。
  • 複数の問題があるため、頻度圧縮オプションを廃止した。
    • デコーダーは互換のために残しています。

2022/06/01更新

  • 追加圧縮にPackBits的なロジックを加えることで、圧縮率を改善した。
  • 読み込まれた画像が壊れていないか確かめる簡易コンペア機能を追加した。
  • さらなる圧縮のために頻度圧縮を追加した。(処理時間がすごくかかるのでオプション扱い)
  • おまけ兼テスト用に搭載していたSRI形式のデコーダーを廃止した。

2022/05/27投稿

投稿ページを作成。 18:40更新 ver36(2:6)モードを追加 ver50を34に変更(50でも読み込み互換性あり)

解説

昔作った連長圧縮のSRI形式を発展させ、辞書式圧縮を加えた物です。

データの「バージョン」について

圧縮データの先頭から2要素目(添字が1の要素)の最上位バイトの値をバージョンと呼び、圧縮の種類を表します。

  • バージョン&H7F:頻度圧縮されたデータ。これを展開すると&H20の追加圧縮データが出てきます。
  • バージョン&H20:追加圧縮されたデータ(アプデ後の新形式)。役割は&H23と一緒です。
  • バージョン&H23:追加圧縮されたデータ。これを展開すると下記のいずれかが出てきます。
  • バージョン&H34:モード4:4で基本圧縮されたデータ。
  • バージョン&H35:モード3:5で基本圧縮されたデータ。
  • バージョン&H36:モード2:6で基本圧縮されたデータ。

モードx:yのxとyを足すといずれも8になることから分かるように、8bitを按分して連続数と辞書インデックスに割り当てます。
プチコンの整数型変数は32bitなので、配列の各要素にこの塊を4個ずつ詰め込んでいくことができます。
各モードの詳しい意味は後述。  

連長圧縮について

原始的なアルゴリズムで、実用的ではないと思われるかもしれませんが
データが連続しない時に肥大する欠点を小さくする工夫をして実装しています。
具体的には、色の連続数を可変長のビット列に分割して記録します。

連続数を表すビット列の単位はモードによって異なり

  • 2:6モードのとき 2bit単位
  • 3:5モードのとき 3bit単位
  • 4:4モードのとき 4bit単位

例えば、同じ色が210個連続する場合

  • 2:6モードでは 3 , 1 , 0 , 2(= 3*4^3 + 1*4^2 + 0*4^1 + 2*4^0)
  • 3:5モードでは 3 , 2 , 2(= 3*8^2 + 2*8^1 + 2*8^0)
  • 4:4モードでは 13 , 2(= 13*16^1 + 2*16^0)

といったように記録します。
これにより、色が連続しない時のデータ量を小さくすることができます。

辞書式圧縮について

一意のパレットを作るほしけんさんのGPKライブラリ(Toukou/GPKライブラリ)などとは異なり、直近の指定色数以内にある場合のみ参照を行い、そうでない場合は新たに辞書に登録します。(相対辞書方式?)
一般に、辞書式圧縮では「一致位置」と「一致長」というパラメータを用いる場合が多いですが、SRDフォーマットでは一致長を

  • 基本圧縮では色単位(16bit)
  • 追加圧縮では配列要素単位(32bit)

で固定し、一致位置のみを記録しています。
辞書式圧縮というよりもパレット方式に近い概念です。

辞書の範囲はモードによって異なり

  • 2:6モードのとき 直近の63色(6bitインデックス)
  • 3:5モードのとき 直近の31色(5bitインデックス)
  • 4:4モードのとき 直近の15色(4bitインデックス)

さらに「一度圧縮した配列を再び辞書式圧縮に掛ける」(以下、追加圧縮)という処理を実行します。
追加圧縮にもモード(辞書の範囲)の違いが存在します。

追加圧縮の辞書の範囲は

  • 4分割モードのとき 直近の766要素(256*3-2)
  • 8分割モードのとき 直近の22要素(16*3-2)

※ちなみに「分割」は配列変数の1要素(32bit)を何個に分けて使うか、という意味

基本圧縮と追加圧縮の組み合わせは下記の6通り存在し

基本圧縮2:6モード
追加圧縮4分割モード
基本圧縮3:5モード
追加圧縮4分割モード
基本圧縮4:4モード
追加圧縮4分割モード
基本圧縮2:6モード
追加圧縮8分割モード
基本圧縮3:5モード
追加圧縮8分割モード
基本圧縮4:4モード
追加圧縮8分割モード

SRDSAVEFILE命令・SRDSAVEDAT命令では、この中からもっとも成績が良かったものを保存します。

頻度圧縮について

特定のデータの長さで誤動作する問題を抱え、圧縮率が処理時間に見合わないことも考慮し、この機能は廃止しました。
互換のため、読み込みのみ対応します。

追加圧縮済みデータをバイト単位に分割、バイトごとの値の出現ランキングを作成します。
このランキングで上位32位までに入った値を6bitの符号に置き換え、それ以外の224個の値を9bitの符号に置き換えます。
上位の値が十分に多い場合、データが小さくなります。
(実際の効果は5~10%程度)

あまりにも展開処理に時間がかかるという欠点があるため、オプションのSRDMORECOMPを有効にした場合のみ機能します。
(頻度圧縮をしない場合に比べ、2倍以上の時間がかかる)

そのほかのお話

連長圧縮と辞書式圧縮を組み合わせるアイデアは、最近コンピュータ向けに発案されたQOIフォーマットという形式の影響も受けています。
しかし、プチコン3号は16bitの色コードという特殊な仕様であることからQOIフォーマットを規格通りに実装するには不向きなこと、すでに連長圧縮を用いたSRIフォーマットを自作していたことから、その発展形として新しい規格を作ることにしました。

スクリーンショット・動画

なし

公開キー

プチコン3号用の公開キーです。トップメニューの「作品公開とダウンロード」から公開キーを入力すると、作品をダウンロードすることができます。

プチコン3号/BIG 公開キー
DBR37NQE

約9キロバイト(単独のファイルサイズ)

CHECKER FLAG (ひとことコメント)

この作品に対するコメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)

  • あまさとしおん : OverFlowで試作品を公開した圧縮ライブラリの改良版です。 (2022/05/27 (金) 14:07:30)
  • あまさとしおん : あとでもうちょっと説明を親切にする予定ですが、とりあえずこの辺で (2022/05/27 (金) 14:14:38)
  • あまさとしおん : OUT文の戻り値を書き忘れて、動作しない命令があったので修正しました (2022/05/27 (金) 14:32:04)
  • あまさとしおん : もう少しだけ圧縮を極めることができた(追加圧縮の改良)ので、近く上げますね。過去のファイルの読み込み互換はあります。 (2022/05/31 (火) 16:59:13)
  • あまさとしおん : それと、展開データが壊れてないか確認する簡易コンペア機能も追加されます(使う場合は読み込みの速さは落ちますが) (2022/05/31 (火) 18:53:51)
  • あまさとしおん : アプデしました。おまけで頻度圧縮も追加しましたが、あまりにも遅いためオプションになりました。 (2022/06/01 (水) 16:46:47)
  • あまさとしおん : サイズが増えたので、テスト用のSRIデコーダーを廃止しました (2022/06/01 (水) 20:26:03)
  • あまさとしおん : アップデートが頻繁すぎると使いづらいと思いますので、今日の更新以降は不具合修正を除きしばらくなしにします (2022/06/01 (水) 20:42:03)
  • あまさとしおん : 頻度圧縮オプションが、特定の条件(データの長さ)で正しく動作しない場合があるため、効果が薄いことも考慮し当該オプションは削除しました。互換のため読み込み機能のみ残しています。 (2022/06/09 (木) 18:28:48)
  • あまさとしおん : 読み込みの互換性は6/1の更新から変化していませんので、無理に差し替える必要はありません。 (2022/06/09 (木) 18:38:45)
  • あまさとしおん : 細かいアップデートが多くてすみません。余ってる符号領域が何かに使えないかと考えた結果、辞書の幅に割り当てられることに気づいたのでその点を改良しておきました。 (2022/06/10 (金) 18:01:37)
  • あまさとしおん : 未使用の符号領域は今回の変更で無駄なく使い、新しいアルゴリズムを重ね掛けするのは処理時間の悪化につながることから 圧縮率が向上するようなアップデートは今日が最後になると思います。 (2022/06/10 (金) 18:10:01)
  • あまさとしおん : あと、処理時間の目安で配列変数とファイルで時間が異なることから表記を修正しました。 (2022/06/10 (金) 18:20:27)
  • あまさとしおん : そもそもLOADの処理時間がSDカードの性能で変わる気がするし、配列読み書きを基準にしないと個体差だらけであてにならないということに気づいた (2022/06/10 (金) 18:24:44)
  • あまさとしおん : 今処理時間を測り直したら急に遅くなって、過去のバージョンで測り直したら同じぐらい遅くなっていたので、SDカードのコンディションで変化することに気づいたという (2022/06/10 (金) 18:32:13)

メニュー 【3号】

ヘルプ

リンク

最近の更新

最近の人気ページ

オンライン情報

  • 現在同時に 1 人がこのサイトを見ています
  • このページはこれまでに 175 回、本日は 1 回、昨日は 0 回閲覧されました

ページの先頭に戻る

*1 基本圧縮3:5モード、追加圧縮なし
*2 具体的には1.5倍

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.159 秒 | このページの最終更新 : 2022/09/20 (火) 12:48:46 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30