catch - みる会図書館


検索対象: JPEG-概念からC++による実装まで
14件見つかりました。

1. JPEG-概念からC++による実装まで

土 n し CJpegDecoder : : DoDecode ( void ) try{ / / ハフマンテープル , 量子化テープル , スキャンデータの存在の確認 if ( ! (mproperty . CanDecode & ()m 工 sHTab1e ー em 工 sQTable ー em 工 sStartData) ) return emDataError; / / 復号可能ならば Decode ( ) : return emNoError ー catch( EMemoryError &me ) { De1eteRGB( ) : emRuntimeError : catch( E 工 ndexError &ie ) { De1eteRGB() ー return emRuntimeError : catch( EBufferError &eob ) { De1eteRGB( 房 return emRuntimeError; catch( EDataFormatError &dfe ノ、フマンテ 復号処理を始める前に、 return emDataError,• De1eteRGB() ー catch( ENOtSupported &ns return emDataError : De1eteRGB() : メモリエラー発生 / / RGB 領域の廃棄 / / 実行時ェラー テープルアクセス違反 / / RGB 領域の廃棄 / / 実行時ェラー バッフアアクセス違反 / / RGB 領域の廃棄 / / 実行時ェラー / / ハフマン符号復号失敗 / / RGB 領域の廃棄 データ工ラー / / 非対応フォーマット / / RGB 領域の廃棄 データ工ラー ープルと量子化テープルが作成されているかどうか # pragma 指令を実行しています。 C0deWarrior では警告はでません。他のコンパイラに 令を実行しています。また、 D 。 c 〇 d 土 ng ( ) の記述の後には、警告の設定を元に戻すように ます。 DoDec 。 de ( ) の記述の前に、 Visual C + + がこの警告を出さないように # prag 爪 a 指 また、 ca し ch ハンドラの仮引数を使用していないため、一部のコンパイラでは警告がで けで、特別な処置はしていません。読者が目的に応じてコードを追加してください。 ンドラを用意しています。 c atch ハンドラのなかでは RGB データの廃棄を行っているだ また、 D 〇 Decode ( ) 内でのエラー処理のため、全体をし ry プロックで囲み、 catch ハ がないデータを復号しようとすると、 emDataError を返します。 と、スキャンデータがあるかを確認します。テープル指定がなかったり、スキャンデータ 4.5 CJpegDecoder クラス

2. JPEG-概念からC++による実装まで

return ( 土 n し ) emNoError; return ( 土 n に ) emNoError; / / end try / / 工ラー処理 catch ( EMemoryError &me ) { return ( int ) emRuntimeError : return ( 土 n し ) emDataError; catch( ENotSupported &ns ) { return emDataError : catch( EDataFormatError &dfe return ( 土 n し ) emDataError ー catch( EBufferError &eob ) { return ( 土 n し ) emDataError 冫 catch( E 工 ndexError &ie ) { ェラー無し ( スキャンデータ無し ) ー発生 / / 実行時工ラー メモリエラ テープルアクセス違反 データ不正によるアクセス違反 / / 非対応フォーマット テ・一タ工ラー / / ハフマン符号の復号失敗 / / EO エマーカが含まれていない バッフアアクセス違反 データ不正によるアクセス違反 この処理のなかでは、いくつかのエラーが発生する可能性があります。そこで、解析処 理をし ry プロックで囲んでいます。工ラー処理は Do De c 。 de ( ) とよく似ていますが、 RGB データ領域をまだ確保していないので、その廃棄を行う必要はありません。 ヘッダの解析処理は、 SOI マーカの検出から始めます。 S OI マーカが見つかるまで Ge tMarker ( ) でマーカを読み出します。もし、バッフアの最後に到達してしまったら、 読み出し処理のなかでむ hr 。 w が実行されることでしよう。 一部のプログラムでは、バッフアの先頭に SOI マーカがなければすぐにエラーとするこ ともあるようです。しかし、通信などで余計なヘッダが含まれている可能性もあるので、 D 。 Ana1ys 土 s ( ) では SOI マーカが先頭になくてもエラーにはしません。 SOI マーカを検出したら解析処理を行います。解析処理は Ana1ysisMarker() で行い ます。このとき、解析によって何が得られたかを返値とします。これは、 eAna lys 土 s Re s u 1 しで宣言されたとおり、ビットごとに属性が決まっているので、 mp rop e r ty ・ canDecode にトで追加していくことで一元管理できます。そして、スキャンデータ ( ェ ントロピー符号化セグメント ) の始まりに到達したら、解析処理を終了します。 DoAna1ysis() も catch ハンドラで引数を使用していないので、コンパイルエラーが 発生することがあります。 DoCoding() と同様に、 DoAna1ysis() の前後で #pragma 指 令を使ってコンパイラの警告の設定を行っています。 4.5 CJpegDecoder クラス 145

3. JPEG-概念からC++による実装まで

0 コ 4 ・ JPEG データフォーマットエラー例外通知用クラス class EDataFormatError public : EDataFormatError ( VOid* address, char* message ) { mAddress=address; データフォーマットエラーは、 JPEG データを解釈中に予期しない値を読み出したとき / / 工ラーメッセージ ー発生アドレス mMessage=message; } : / / 工ラーメッセージ / / 工ラー発生アドレス void* mAddress; char* mMessage; / / 工ラ に発生します。 JPEG データの次回読み出しアドレスとコメントで、エラー発生状況がわ かります。 0 】 5 ・非対応データ工ラー例外通知用クラス class ENotSupported public : ENotSupported( eMarker aMark, VO 土 d 夫 address ) / / フレームコード / / 工ラー発生アドレス { mMark=aMark; mAddress=address : } ー eMarker mMark; void* mAddress; / / フレームコード / / 工ラー発生アドレス CJpegDecoder では、基本 DCT 方式のデータのみを解釈します。また、成分数は 1 ま たは 3 (JFIF) である必要があります。検出した非サポートマーカと次回読み出しアドレ スを通知します。 catch する場所 前述のとおり、 catch ハンドラは CJpegCoder と CJpegDecoder のインタフェースで ある公開メソッドの中におきます。 サンプルプログラムでは、 catch ハンドラ内で特別な処理を行っていません。デバッガ を用いて、これらのクラスのメンバを参照するか、アラート表示できるように改造すると よいでしよう。 0 」 1 ・ CJpegC0der CJpegCoder では DoCoding() メソッド内で ca し ch します。発生するエラーはメモリ、 3.6.3 3.6 工ラー処理 バッフア、テープル外参照の 3 種類です。 catch ハンドラの例を示します。

4. JPEG-概念からC++による実装まで

ーエラー処理 工ラー処理の方針 3.6 ゴーー 3.6 3 2 るように、コンストラクタの引数で設定値を渡すことにしました。こうすると throw を 1 例外を発生するメソッドで、エラー通知オプジェクトのメンバ変数の設定が簡単にでき ドラでエラーの原因の確認が簡単にできるでしよう。 工ラー通知用クラスのメンバ変数は、すべて公開しました。これによって、 catch ハン ェラー通知用クラスの名前には、接頭辞に℃ " ではなく " E " を用います。 通知オプジェクトのメンバ変数にアクセスすることによって、エラーの詳細がわかります。 として渡され、インタフェースとなるメソッドの catch ハンドラで処理します。工ラー 工ラー通知用のクラスは、 JPEG. h で定義しています。これらのクラスは throw の引数 工ラー通知用クラス たときに、エラーの内容や位置などのデバッグに役立つ情報が得られます。 数として渡すことにします。デノヾッガを使い、 catch ハンドラにプレークポイントをおい るように、発生したエラーの種類に対応したエラー通知オプジェクトを作り、 throw の引 それ以外の細かい処理は行いません。そのかわり、デバッグ時に必要になる情報が得られ サンプルプログラムでは、動的に確保したメモリ領域をエラー処理で廃棄していますが、 に catch ハンドラをおきます。 この目的のため、インタフェースとなる公開メソッドや、その 1 つ下のメソッドのなか でしよう。 と CJpegDecoder を使う人は、 JPEG 処理に精通する必要がないので使いやすくなること の有無と若干の種類だけを通知するようにします。こうすることによって、 CJpegC0der と c ユ pegDec 。 der のインスタンスを生成して呼び出しているオプジェクトには、エラー したか、という情報をクラスの中だけでもちます ( カプセル化 ) 。そして、 CJpegcoder CJpegCoder と CJpegDecoder では、 JPEG の処理におけるどのようなエラーが発生 知します。 ェラーを発見したら例外を送出して、制御構造の上位にいるオプジェクトやメソッドに通 ェラーの検出は、ソースプログラム上のエラーが発生する可能性のある場所で行います。 3.6 工ラー処理 工ラー通知用クラスは以下の 5 つです。 行で書くことができ、可読性が上がるでしよう。

5. JPEG-概念からC++による実装まで

catch ( EMemoryError &me ) { emRuntimeError ー ー発生 / / 実行時ェラー / / メモリエラ この処理では、呼び出しアプリケーションに実行時ェラーを返すだけです。デバッガが DoDecode() での ca し ch ハンドラの例を示します。 JPEG. h で宣言したすべてのエラーが発生する可能性があります。 CJpegDecoder では DoDecode() と DoAnaIysis() で catch します。こでは、 ■ 12 ・ CJpegDecoder でエラーが発生したかわかります。 動作しているときは、引数のエラー通知オプジェクトのメンバ変数を調べることで、どこ catch ( EMemoryError &me ) { De1eteRGB( 房 return emRuntimeError,• / / メモリエラー発生 / / RGB 領域の廃棄 / / 実行時工ラー メモリエラーの処理では、復号処理のはじめの段階で RGB 画像格納領域の確保が行わ れているので、これを De1e し eRGB ( ) で廃棄して、実行時工ラーを返します。他のエラー の場合も同様の処理です。 D 。 Ana1ys 土 s ( ) のエラー処理は、 D 。 Dec 。 de ( ) のエラー処理とよく似ていますが、ま だ RGB 格納領域を確保していないので、 De1e に eRGB ( ) を呼びません。 CJpegCoder と同様に、デバッガが動作しているときは、引数のエラー通知オプジェク トのメンバ変数を調べることで、どこでエラーが発生したかわかります。 第 3 章仕様と論理設計

6. JPEG-概念からC++による実装まで

/ / CJpegC0dWinView クラスの描画 void CJpegC0dWinView: : OnDraw (CDC* PDC) CJpegCodWinDoc* PDOC = GetDocument ( ) 冫 ASSERT_VAL 工 D (pDoc ) ー / / TODO : この場所にネイテイプデータ用の描画コードを追加します cpoint point(O,O) ー / / D ェ B を描画 CDib* pDib = pDoc->GetDib( ) ー pDib—>Draw 工 mage (PDC ′ point) : ・符号化の実行とファイルの書き込み / / TODO : この位置に固有の処理を追加するか、または基本クラスを呼び出してください BOOL CJpegCodWinDoc : : OnSaveDocument (LPCTSTR lpszPathName) / / ユ PEG ファイルセープ時の処理 ます。符号化が完了したら、 JPEG データをファイル保存します。 す。このメソッドで CJpegCodWinDoc: :DoCoding( ) を呼び出し、 JPEG 符号化を行い ファイルが指定されると、 CJpegCodWinDoc: :0nSaveDocument( ) が呼び出されま て保存 ] を選ぶと実行されます。 符号化はメニューから [ ファイル ] ー [ 上書き保存 ] または [ ファイル ] ー [ 名前を付け JpegFiIe . WriteHuge(pBitStream, (DWORD)iSize) : CFiIe: :modeCreatelCFiIe: :modeWrite lCFi1e: :typeBinary) : CStdioFiIe JpegFiIe(1pszPathName, / / JPEG ファイルの保存 DoCoding(pBitStream, iSize) ー / / JPEG 符号化 try{ 土土 S 土 Z e char* pBitStream = NULL; JpegFi1e . C10se(); }catch(CException e) { TCHAR szErrBuf[256]; e . GetErrorMessage ( szErrBuf , AfxMessageBox ( szErrBuf ) : return FALSE; }catch(CString strErr) { AfxMessageBox(strErr) : return FALSE; sizeof(szErrBuf) ) : 4.1 上位クラス

7. JPEG-概念からC++による実装まで

使うことができないものがあります。そこで、固定値の部分は直接上書きしています。 ■】 4 ・符号化実行 DoCoding ( ) は JPEG 符号化を実行します。 int CJpegCoder : : DoCoding ( void ) / / 縦ユニット数 / / 横ユニット数 / / 定数の計算 mNumVUni ts mNumHUn 土し s (mProperty . VSize / 16 ) + ( (mProperty. VSize 宅 16 ) (mProperty. HSize / 16 ) + ( (mProperty. HSize 16 ) ? 1 ? 1 / / JPEG デー 土 n し Size タサイズ ( バッフアサイズ ) の計算 / / JPEG データはこの値より小さくなることが期待できる mProperty. HSize ☆ mProperty . VSize / / 画像の 3 色分のドット数 / / 元画像が小さすぎると、 JPEG データは大きくなって / / しまうことがあるので、最小サイズを 10K バイトとしておく if( size く 10240 ) 10 2 4 0 : S 工 Z e / / 符号化 try { / / 最小サイズを 10K バイトに mOBSP = new COutBitStream( size ) ー ビットストリームの生成 WriteHeader( ) : / / MCU ごとに / / ヘッダの書き出し for( 土 n し yu=0; yu<mNumVUnits; yu + + ) { for ( 土 n し xu=0 ー xu く mNumHUnits ー xu 十 + makeYCC ( xu, yu ) : / / RGB->YCrCb 変換 #ifdef GRAY #endif / / 2 5 6 階調グレー化 for( 土 n し i=0; 土く 64 : 土 + + ) mCbB10ckP[i] CodeMCU ( 房 mCrB10ckP[i] / / 符号化の実行 / / Cb , cr を 0 WriteEOI ( ) ー / / EO ェの書き込み / / メモリエラー発生 / / 実行時ェラー / / 実行時ェラー / / ストリームバッフアアクセス違反 118 emNoError,• / / try / / 工ラー処理 catch ( EMemoryError &me ) { retUrn emRuntimeError,• catch( EBufferError &be ) { return emRuntimeError; 第 4 章実装

8. JPEG-概念からC++による実装まで

ドキュメントクラスは、 CJpegCodWi nDo c です。 BMP ファイルのオープンと表示、 JPEG 符号化とファイル保存の制御を行います。 BMP ファイルならばすべて開くことがで きますが、 JPEG 符号化できるのは 16 色以上のデータだけです。 16 色未満のデータは表示 はできますが、 JPEG 符号化はできません。 オープンした BMP 画像の表示を行うのが CJpegC 。 dW 土 nv 土 ew です。このクラスは CScr011V 土 ew からの派生クラスです。 BMP データから DIB (RGB) データを作るために CDib というクラスを作成しました。 その他に CJpegCoder と coutBitStream が含まれています。 このプロジェクトは CJpegC 。 der と c 〇 u に B 土し s し ream の動作を確認するためのもので す。ですから、 BMP ファイルのオープンと表示、符号化して得られた JPEG データのファ イル保存機能しかあり . ません。実用的なアプリケーションは読者が独自に作成してください。 ・ファイルの読み出し メニューから [ ファイル ] - [ 開く ] を選ぶと、ファイル選択ダイアログが開きます。 ファイルを選択すると、 CJpegCodWinDoc: :OnOpenDocument( ) が呼び出されます。 こで BMP ファイルを読み込み、 DIB データを作成しています。 / / CJpegC0dWinDoc コマンド BOOL CJpegCodWinDoc : : OnOpenDocument (LPCTSTR 1pszPathName ) if ( ! CDocument : : OnOpenDocument ( 1pszPathName ) ) return FALSE; / / TODO : この位置に固有の作成用コードを追加してください try{ CFi1e BmpFi1e (1pszPathName, CFi1e: :modeRead) : m Dib . BmpLoad(BmpFi1e) : BmpFi1e . C10se() : }catch (CDibException eDib) { CString strMessage; 1pszPathName : strMessage strMessage + = strMessage + = eDib . GetErrMessage( ) ー AfxMessageBox(strMessage) 冫 return FALSE; }catch (CException e) { TCHAR szErrBuf [ 256 ] ー e . GetErrorMessage(szErrBuf, AfxMessageBox ( szErrBuf ) : return FALSE : return TRUE ー DIB データができれば、 CJpegCodWinView : s 土 z e 0 f ( s z ErrBu f ) ) : :0nDraw( ) で表示されます。 90 第 4 章実装

9. JPEG-概念からC++による実装まで

ヲ / 0 -6 っ 0 っ 0 っ 0 - ) -6 ラ / ラ / 8 8 8 8 3.5.2> CInBitStream クラス・ 3.5.3> CJpegC0der クラス・ 3.5.4> CJpegDecoder クラス・ 3 工ラー処理 3.6.1 工ラー処理の方針 3.6.2> 工ラー通知用クラス 3.6.3> catch する場所 ・・・ 88 ・・・ 88 ・・・ 88 ・・・ 107 ・・・ 107 ・・・ 107 ・・ 112 ・・・ 116 ・・・ 116 ・・・ 116 ・・・ 121 ・・・ 154 ・・・ 159 ・・・ 159 ・・・ 159 ・・・ 140 ・・・ 144 実装 第 4 章 上位クラス 4.1 4.1.1> 処理の内容・ 4.1 .2> Windows 4.1.3> Macintosh ・ 4.2 COutBitStream クラス 4.2.1 ヘッダファイル・・ 4.2.2> インタフェース・・ 4.2.3> 非公開メソッド・・ 4.3 CJpegC0der クラス 4.3.1> ヘッダファイル・・ 4.3.2> インタフェース・・ 4.3.3> 非公開メソッド・・ 44 CInBitStream クラス 4.4.1> ヘッダファイル・・ 4.4.2> インタフェース・・ 4.4.3> 非公開メソッド・・ 4.5 CJpegDecoder クラス 4.5.1 ヘッダファイル・・ 4.5.2> インタフェース・・ 4.5.3> 非公開メソッド・・

10. JPEG-概念からC++による実装まで

return TRUE; ・画面表示 描画では、必要に応じて、随時フレームワークから各ビューの OnDraw ( ) が呼び出され ることで行われます。 / / CJpegDecodeWinView クラスの描画 ASSERT_VAL 工 D (pDoc) ー CJpegDecodeWinDoc* pDoc ニ GetDocument ( ) : VOid CJpegDecodeWinView: : OnDraw (CDC* pDC) AfxMessageBox ( eDib . GetErrMessage ( ) ) ー }catch(CDibException eDib) { pDoc—>GetDib ( ) —>Draw 工 mage (pDC ′ Pos ) ー try{ / / 復号したこ PEG データを表示 CPoint Pos(0,O) : return,• / / プリンタ出力はサポートしない if(pDC-> 工 sPrinting() ) { / / TODO : この場所にネイテイプデータ用の描画コードを追加します Macintosh coder と CJpegDecoder の使い方を参考にして、独自にアプリケーションを作成してみ これ以外の開発環境を使用している方は、本書付属のサンプルプログラム中の c こ peg けてあります。 部分はプロジェクト生成時に作られたコードです。変更部分には、日本語のコメントがっ ドキュメントを参照してください。ソースプログラム中で、コメントが英語になっている PIant 1.9 で作成しています。 CodeWarrior Pro 3 と PowerPlant については、それぞれの Macintosh 用のアプリケーションは、メトロワークス社の CodeWarrior pro 3 と power てください。 ■ 11 ・ JPEG 符号化アプリケーション ・プロジェクトの構成 JPEG 符号化アプリケーションプロジェクトは、 プロジェクトウインドウを Fig. 4.3 に示します。 第 4 章実装 ' JPEGCoder " という名称にしました。