タイトル【小池邦人のプログラミング日記】2000/9/19<骨までしゃぶろうQuickTime 画像を回転させる>カテゴリーQuickTime, 小池邦人のプログラミング日記
作成日2000/9/19 23:6:41作成者小池邦人
本当ならば、Mac OS Xパブリックβ版のファーストインプレッションや、Carbon化されたアプリケーションがきちんと起動するかどうかの話しをしたいのですが、残念ながらまだ「物」を入手することができません(涙)。ADC(Apple Developer Connection)メンバー宛には9/18に発送されたそうですので(Appleの話しを信じればですが...)もう少し待つことにいたしましょう。まさかUSAのメンバーだけに発送されたということはないと思いますが、今月中に入手できるかどうか本当に心配です。

そんなわけで、代打としてQuickTimeの「簡単に使え非常に効果が大きい」APIの活用方法を紹介してみたいと思います。今回は「Graphics Importer Components」(以降はGraphics Importerと表記)のAPIを利用し、色々なタイプの画像ファイルをウィンドウに表示するルーチンに挑戦してみます。このルーチンには、画像を90度、-90度、180度回転させて表示するオプションも付けることにします。Graphics Importerに属するAPIは、すべて「ImageCompression.h」に記載されています。また、それらに関するドキュメントは、以下のApple QuickTimeのサイトからダウンロードすることができます。
◇QuickTime 4 Developer Documentation
 http://developer.apple.com/techpubs/quicktime/qtdevdocs/RM/pdfframe.htm

Graphics Importerに関しては、特に「QuickTime 4 Reference for Macintosh and Windows 」に詳しく解説されていますので、ぜひ参考にしてみてください。ダウンロード後のPDFファイル名は「QT4Reference.pdf」となります。

別掲の記事に紹介したrotateImage()が、Graphics Importerを使い画像を回転表示するためのルーチンです。rotateImage()の引数は、画像ファイルの保存場所を示すFSSPecのポインタ(fsc)と、回転タイプを指示するオプションパラメータ(dir)です。dirがゼロならばノーマル表示、1なら90度、-1なら-90度、2ならば180度回転させてから画像をウィンドウに表示します。

まずはGetGraphicsImporterForFile()にFSSpecを渡し、画像タイプに対応したGraphicsImportComponent(gi)をオープンさせます。ここでは画像タイプを意識する必要はありませんが、もし指定されたファイルがGraphics Importerで取り扱えないタイプであれば、この時点でエラーが返されます。QuickTimeでは、バージョンが上がるたびに取り扱い可能な画像タイプが増えていきました。現在ではPICT、JPEG、BMP、GIF、TIFFなどの一般的な画像ファイルだけでなく、Adobe Photoshopのネイティブドキュメント(レイアー付き)やFlashPixファイルなども取り扱い可能です。

続いてGraphicsImportGetNaturalBounds()により画像ファイルの矩形サイズ(drt)を得ます。これを参照してウィンドウの矩形サイズ(wrt)を決定するのですが、画像を90度や-90度回転させる場合には、ウィンドウの縦横サイズを入れ替える必要がありますので注意してください。ウィンドウはCreateNewWindow()で作成し、ShowWindow()の代わりにTransitionWindow()を用いてズーミングアニメーション付きでオープンします。GraphicsImportSetGWorld()では、描画対象となるCGrafPtr(GWorld)をセットします。ここにオープンしたウィンドウのCGrafPtrをセットしておかないと、画像の描画はデスクトップ上になされてしまいます。注意しましょう。dirがゼロで回転をさせない場合には、GraphicsImportSetBoundsRect()で描画矩形領域を指示し、後はGraphicsImportDraw()を呼ぶだけで、オープンしたウィンドウ上に画像が描画されます。最後にCloseComponent()でGraphicsImportComponentを閉じれば、すべての処理は完了します。

dirがゼロ以外ならば90度や180度の回転を行うことになり、描画する時の座標変換用にMatrixRecord(3x3のマトリックス)を用意します。3x3マトリックスで座標値に対して行列式(昔を思い出しましょう!)を実行するわけです。Graphics Importerでは、このマトリックスに色々な値を設定することで、オリジナル画像を移動、拡大、回転、変形させて描画することができます。マトリックスの各要素はFixed(固定小数点)で保存されていますので、まずはLong2Fix()によりlong値をFixed値に変換します。Long2Fix()を含むFixed値の演算や変換ルーチンはすべて「FixMath.h」に定義されていますので参考にしてください。

rotateImage()の内部パラメータとしては、fdが回転角度、cxとcyが回転の中心座標を保持しています。加えて、回転が90度と-90度の場合には、回転後に平行移動で画像原点をウィンドウ原点に合わせる必要がありまので、平行移動用のパラメータをdxとdyに保持します。GraphicsImportGetMatrix()で得た初期マトリックス(mm)にRotateMatrix()で回転用マトリックスを設定します。90度と-90度回転の場合には、TranslateMatrix()で平行移動用マトリックスも追加します。最後に出来上がった3x3マトリックスをGraphicsImportSetMatrix()で戻してやれば準備は完了です。

もちろんrotパラメータを90以外の値にしても問題はありません。ただし、その場合には回転に合わせてウィンドウサイズを大きくする必要があるでしょう。興味ある方は、色々なマトリックスを設定し、画像がどのように表示されるか試してみると面白いでしょう。表示後の画像をスムーズにスクロールさせたり、何らかの編集(フォトレタッチなど)を加える場合には、表示対象をオフスクリンバッファ(オフスクリンGWorld)に設定する工夫が必要です。チャレンジしてみてください。

さて、次回にはMac OS Xパブリックβ版の話しができるのでしょうか?ひょっとしたら、また代打が出るかもしれません。その次もまた...(涙)
[小池邦人/オッティモ]
関連リンクオッティモ