高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先



QD51 - 8 ビットより大きいグレイスケール画像の作成

(97 年 11 月 17 日)

Q: 8 ビットより大きい解像度のグレイスケール画像を作成して、Mac で表示したいと思います。最良の方法を教えてください。

A: Quickdraw には元来グレイスケール PixMaps のサポートがないため、独自のデータ構造を構築してグレイスケール画像を操作し、オフスクリーンの GWorld にコピーして、画面に描画する必要があります。

Quickdraw のオフスクリーン用カラーテーブルは、白が 0、黒が 255 の位置になります。Quickdraw は常に白と黒がこの位置にあるものと考えるため、別の位置にあると正しく動作しません。ところが、これはグレイスケール画像の輝度とは反対です。グレイスケールの場合、黒が 0、白が 255 の位置になります。

他に必要なのは、独自のデータ構造を Quickdraw のオフスクリーンに変換するためのルーチンです。この変換は各グレイスケールのピクセルの最上位 8 ビットを取り、これを反転してオフスクリーンの GWorld にコピーして行います。『Develop 10: Drawing in GWorlds for Speed and Versatility』に、良い説明が載っています。以下のコードは、4 ピクセル分のデータについて、16 ビットのグレイスケール・ピクセルから 8 ビットのカラー・インデックスに変換するものです。

UInt16 *sourceGreyPtr;
UInt32 *destPixelsPtr;
UInt16 pixel1, pixel2, pixel3, pixel4;
UInt32 pixelOutput;

{
        pixel1 = sourceGreyPtr[0];
        pixel2 = sourceGreyPtr[1];
        pixel3 = sourceGreyPtr[2];
        pixel4 = sourceGreyPtr[3];
        // 各ピクセルを該当位置までシフトして、補数を取り、該当バイトをマスクする
        pixel1 = ~(pixel1 << 16) & 0xFF000000;
        pixel2 = ~(pixel2 << 8)  & 0x00FF0000;
        pixel3 = ~(pixel3)       & 0x0000FF00;
        pixel4 = ~(pixel4 >8)  & 0x000000FF;
        pixelOutput = (pixel1 << 24) | (pixel2 << 16) | (pixel3 << 8) | (pixel4);
        *destPixelsPtr = pixelOutput;
         sourceGreyPtr +=4;                           // 8 バイト進める
         destPixelsPtr +=1;                           // 4 バイト進める
}
Quickdraw GX には、輝度ベースのカラーモデル (gxGraySpace) が含まれています。

-- Tim Carroll
devsupport@apple.com


[ Technical Q&A's : Graphics & Media : QuickDraw : QD51 ]