ホーム : 実験室 : TestPicSize
TestPicSize(2007/11/27)
大きな画像サイズをテストするためのプログラムです。AppleにBugReport しようかと作ったプログラムなのですが、あちこちで不具合がでるので無駄 だなとやめました。 画像の幅が32768ピクセルを超えると実行の都度違った場所でダウンした り、表示が不正だったりします。Quartz2Dの中のあちこちにshort変数によ る縛りがあるようです。今回のプログラムでは使用していませんが、 QuickTimeで画像を保存しようとしたときにも、画像の幅が32768を超えると 不具合が出ます。JPEG変換は時間をかけて実行しているのに、保存したファ イルはサイズがゼロだったりします。 ということでSimpleDEMViewerで、32767 ピクセルまでの制限を残します。(現在は16384になっていますが) このプログラムは自由に改変して利用してください。
プログラムの概要
- 起動直後、およびファイルメニューのNewを実行することにより、指定した大きさの画像を作りウインドウに表示します。画像は単純に全体を黄色で 塗りつぶし、色違いの斜めの線を引くだけです。
- 画像は CreatePicture() ルーチンで指定された大きさの CGBitmapContext を作成し、描画した後 CGImageRef を作成します。
- スクロールバーにより画像のスクロールができ、現在の表示範囲をフロー トウインドウにCGRect情報(origin,size)として表示します。
不具合箇所
サイズが32768以下の時は問題なく動きますが、それを超えるとあちこちで問題が出ます。
- CreatePicture() の中で、端から端までの線を引くときにダウンしたりしなかったり。
- CGBitamapContextをCGImageRefに変換するときに、現在コメントアウトしてある CGBitmapContextCreateImage() を使用すると描画時に100%落ちる。
- 巧い具合に描画まで行ったとして、ウインドウ左端の画像位置が32768を超えると描画ができず真っ白になる。例えば左端が32760ならウインドウの右端まで正常に描画されるので、CGImageRefは正しく作成できているはず。さらに画像の右端から32768ピクセル以上左側も描画できないですね。
- SetWindowResizeLimits() で最大サイズを32768以上に指定すると、ズームや、ドラッグリサイズができなくなる。今回は最大4000で制限している。( HandleNew() 内)
使用しているテクニック(Carbon入門者のための参考)
- オフライン描画領域CGBitamapContextの作成。(QuickDrawの オフラインGWorld相当)
CreateBitmapContext()
- Quartz2DによるCGBitamapContextへの描画。CreatePicture()
- ユーザーペインへコントロールの描画。DrawUserPane()
(注)現在は画像が上下逆転して描画されているので、文字を含むときは変更要。
- ダイアログからテキスト入力。AcceptPictureSize(), PicSizeWindowEventHandler(), CheckInput()
- 画像のスクロール。スクロールバーのActionProc。DoScrollActions()
プロジェクトはXcode 2.5で作成しています。
ダウンロード testPicSize.zip(44kB)
(C)Copyright 2007, Yoshiaki Katayanagi.
|