ホームページ>開発ツール>REALbasic Mach-O Plugin 覚書・応用編1・画像の回転
REALbasic Mach-O Plugin 覚書
目次
応用編1・画像の回転
はじめに
今回はXcodeテンプレートのカスタマイズと、画像関連プラグインの作成に関する話題です。
Xcodeテンプレートのカスタマイズ
作成するプラグイン群に共通の設定は、テンプレートの段階でカスタマイズしておけば、後で個別に設定し直さなくても済むようになります。
ここでは、以下の2点について設定します。
なお、Deprecatedについては、例えば以下のサイトに詳説されています。
- ユニバーサルバイナリがビルドできるようにする
- コンパイル時に大量に出る「Deprecated」の警告を表示しないようにする
参考サイト(1):Koike ToolBox 2006/09/09手順は以下の通りです。
- /Developer/Library/Xcode/Project Templates/に新規フォルダを作成し、名前をREALbasic Plug-insとする。
- 前回用意したREALbasic Mach-O Pluginフォルダを上記フォルダ内に移動し、コピーを作成する。(名前はREALbasic Mach-O Plugin 2)
- REALbasic Mach-O Plugin 2フォルダ内のプロジェクトをダブルクリック。バージョンが古いとかメッセージが出るので、指示に従って保存する。
保存したプロジェクトをクリック後、コンテキストメニューを開き、「パッケージの内容を表示」を選択。<ユーザ名>.pbxuserと<ユーザ名>.mode1v3を捨て、パッケージを閉じる。- 旧プロジェクトファイルを捨てる。
- プロジェクトをダブルクリックして開く。
- プロジェクトを選択して「情報」ボタンを押し、ビルドタブを表示する。
- 「アーキテクチャ」の「アーキテクチャ」をクリックし、「ppc i386」とタイプ。
注)初出時「PPC」と大文字で表記していましたが、これは誤りで、小文字でなければなりません。(2008.04.30)
- 「GCC 4.0 - 警告」の「推奨されない関数についての警告」のチェックを外す。
- プロジェクトを閉じる。
プロジェクトをクリック後、コンテキストメニューを開き、「パッケージの内容を表示」を選択。<ユーザ名>.pbxuserと<ユーザ名>.mode1v3を再び捨て、パッケージを閉じる。- プロジェクトフォルダのbuildフォルダを捨てる。以上でカスタマイズは終了。
- Xcodeを起動し、テンプレートを選択。
- オプションの設定が継承されているか確認。
注)<ユーザ名>.pbxuserと<ユーザ名>.mode1v3を捨てると、コンパイルエラーが発生することがありますので、捨てる操作は抹消しました。テンプレート作者本人が使う分には特に問題ないと思われます。(2008.03.22)
画像を回転するプラグインを作る
前回作成したサンプルは、実用性という点では殆ど意味はありませんでしたが、画像の回転はプラグイン化の効果が見込める分野です。
プラグイン内での画像の回転処理方式としては、
現在はQuartz 2Dを使うのが主流のようですが、REALbasicとの連携方法が良く分かりません。一方、QuickDrawは比較的情報が揃っていることから、QuickDrawの学習も兼ねて、1の方式でいくことにしました。
- QuickDrawを使って、GWorld(いわゆるオフスクリーン)上でピクセルを操作する
- Quartz 2Dを使って、マトリックスを操作する
なお、学習にあたっては、以下のサイトで公開されている「AkikoMask_Plugin v1.1」を参考にさせて頂きました。
参考サイト(2):S.H.R.今回作成するものは、与えられた画像(Picture)を90度単位で時計回りに回転するもので、以下のようなものです。
アルゴリズムは、Picture型を受け取ってオフスクリーンにコピーし、端から1ピクセルずつ拾っては、もう一つのオフスクリーンに置いていき、終わったらPicture型に変換して返す、という単純なものです。RotateImage(p As Picture, mode As Integer) As Picture (mode=1 : 90度、mode=2 : 180度、mode=3 : 270度、それ以外は入力を返す)
(90度ずつの回転では、規則性があるため、読み出しのループ内で同時に書き出しも行っています。)
作成手順は前回と同じです。
- Xcodeを起動し、ファイル>新規プロジェクト...メニューを選択。
- テンプレート選択ダイアログが表示されるので、REALbasic Mach-O Plugin 2を選択。
- プロジェクトに名前をつける。ここでは「RotateImage」とする。
- RotateImage.cppを開き、(既に書き込まれているものを全て削除後)こちらのコードをコピーする。
注)コードは作者が学習用に試作したものであり、その内容は無保証です。使用した結果、何らかの障害が発生しても、作者は一切の責任を負いません。- ビルドする。
- pbx形式に変換する。
基本的には前回のpbx形式に変換すると同じですが、ビルドされるのがユニバーサル形式のため、フォルダの構成は以下のとおりとします。
RotateImage Build Resources Mac Carbon Mach-O Universal <-- 名前変更 RotateImage.dylib
画像回転プラグインをテストする
動くかどうか、テストします。
- REALbsicを起動する。
- Window1のプロパティに以下を追加。
p1 As Picture p2 As Picture- Window1にCanvasを2個置き、Paintイベントに以下を記述。(上段はCanvas1用、下段はCanvas2用)
if p1<>nil then g.drawpicture p1,0,0,me.Width,me.Height,0,0,p1.Width,p1.Height end ifif p2<>nil then g.drawpicture p2,0,0,me.Width,me.Height,0,0,p2.Width,p2.Height end if- Window1にPushButtonとStaticTextを置き、PushButtonのActionイベントに以下を記述。
Dim t1,t2 As Integer t1=Ticks p2=RotateImage(p1,1) // プラグイン。必要に応じて第2パラメータを2,3にするか、別ボタンを用意する。 t2=Ticks StaticText1.Text=Str((t2-t1)/60) if p2<>nil then Canvas2.refresh else msgBox "err" end if- Window1のopenイベントハンドラに以下を記述。
Dim f As FolderItem f=GetFolderItem("hoge.jpg") // あらかじめプロジェクトと同じフォルダ内に画像ファイルを用意 if f<>nil and f.exists then p1=f.OpenAsPicture Canvas1.Refresh end if- 実行する。(Canvas1に元画像が表示される)
- PushuButtonを押す。Canvas2に回転した画像が表示されればOK。
注)動作テストが目的なので、縦横比の維持は考えていません。性能も計ってみました。
テストマシンはmac mini(Intel Core Duo 1.66GHz, 1GB)
テストデータはデジカメの画像で、2560x1920ピクセル、RGBカラーのjpegファイルです。
90, 270度 0.3秒前後
180度 0.2秒前後
で、まずまず実用範囲内と思われます。
おわりに
いずれにしても、QuickDrawは「Deprecated」なので、Quartz 2Dへの移行は避けられないのでしょう。
ということで、追々ではありますが、Quartz 2Dの学習も心掛けていきたいところです。
注)今回のサンプルはあくまで動作確認用で、配布を前提としたものではありません。(配布用とするにはいくつかの配慮が必要になります。)
お世話になったサイト
貴重な情報をご提供頂いている皆様に、お礼申し上げます。(以下、順不同)
参考サイト(1):Koike ToolBox 2006/09/09
参考サイト(2):S.H.R.
更新履歴
2008.04.30 Xcodeテンプレートのカスタマイズで、タイプミスを修正。(PPC -> ppc)
2008.03.22 Xcodeテンプレートのカスタマイズで、<ユーザ名>.pbxuserと<ユーザ名>.mode1v3を捨てる操作を抹消した。
2008.02.29 新規作成
[Home] [MacSoft] [Donation] [History]