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

Technical Q&A QA1354
Graphics Exporters - Creating 16-bit-per-channel image files

Q:QuickTime のグラフィックスエクスポータでは 1 チャネル 16 ビットの画像は作成できますか?

A:はい。PNG および TIFF グラフィックスエクスポータでは、1 チャネル 16 ビットのピックスマップに基づいて 1 チャネル 16 ビットの画像ファイルを作成できます。1 チャネル 16 ビットのピクセル形式のサポートについては、テクニカル Q&A QA1114「48 bit & 64 bit Pixel Format support in QuickTime」を参照してください。

重要: これらのグラフィックスエクスポータは、1 チャネル 8 ビットのピックスマップを渡されても 1 チャネル 16 ビットの画像ファイルは作成しません

ただし、これを正しく行うには、GraphicsExportSetDepth の呼び出し時に設定する必要のある深度の値は、1 チャネル 8 チャネルの画像ファイルを要求しているように見えます。表 1 を参照してください。

GraphicsExportSetDepth に対する値としては、明らかに k16GrayCodecTypek32AlphaGrayCodecTypek48RGBCodecType、および k64ARGBCodecType がそれぞれ正しい値に見えますが、これらの値を使用すると現時点(QuickTime 6.5.1)では望んでいる出力が得られません。

表 1.

ピックマップと画像ファイルの深度GraphicsExportSetDepth のピクセル形式
16 ビットグレイスケールk8IndexedGrayPixelFormat
31 ビットのアルファ+グレイスケールk32ARGBPixelFormat
48 ビット RGBk24RGBPixelFormat
64 ビットのアルファ+RGBk32ARGBPixelFormat

リスト 1. 48 ビット RGB ソースのエクスポート

// ImproveYourImage のサンプルと組み合わせて使用。後述の「参考資料」参照。

#include "MacShell.h"

void ExportDeepImageAsTIFF(void)
{
    Handle hOpenTypeList = NewHandle(0);
    long   numTypes = 0;
    FSSpec theFSSpec;
    Boolean isSelected, isReplacing;
    GraphicsImportComponent importer = 0;
    GraphicsExportComponent exporter = 0;
    Rect naturalBounds;
    unsigned long actualSizeWritten;
    ImageDescriptionHandle desc = NULL;
    Handle h = NULL;
    OSType pixelFormat;
    GWorldPtr gworld = NULL;
    OSErr err = noErr;
    
    BuildGraphicsImporterValidFileTypes(hOpenTypeList, &numTypes);
    HLock( hOpenTypeList );

    err = GetOneFileWithPreview(numTypes, (OSTypePtr)*hOpenTypeList, &theFSSpec, NULL);
    DisposeHandle(hOpenTypeList);
    if (err) return;
    
    // グラフィックスインポータコンポーネントを探し出して開く
    err = GetGraphicsImporterForFile(&theFSSpec, &importer);
    if (err) return;
    
    // 実際の色空間を調べる
    err = GraphicsImportGetImageDescription(importer, &desc);
    if (err) goto bail;
    
    err = GetImageDescriptionExtension(desc, &h, kImageDescriptionColorSpace, 1);
    DisposeHandle((Handle)desc);
    if (err) goto bail;
    if( !h || !*h ) goto bail;
    
    pixelFormat = *(OSType*)*h;
    pixelFormat = EndianU32_BtoN(pixelFormat);
    DisposeHandle(h);
    
    // インポートした画像が 48 ビット RGB の場合、
    // 1 チャネル 16 ビットの TIFF ファイルとしてエクスポートする
    if (k48RGBCodecType == pixelFormat) {
    
        // 画像をオフスクリーンの gworld に、その色空間を使用して描画する
        err = GraphicsImportGetNaturalBounds(importer, &naturalBounds);
        if (err) goto bail;
        
        err = QTNewGWorld(&gworld, pixelFormat, &naturalBounds,
        NULL, NULL, kICMTempThenAppMemory);
        if (err) goto bail;
        
        err = GraphicsImportSetGWorld(importer, gworld, NULL);
        if (err) goto bail;
        
        err = GraphicsImportDraw(importer);
        if (err) goto bail;
        
        // 画像を TIFF ファイルとして書き出す
        err = PutFile("\pSave the image as:", "\pTest.tiff", &theFSSpec,
                       &isSelected, &isReplacing);
        if (err) goto bail;

        // TIFF グラフィックスエクスポータコンポーネントを探し出して開く
        err = OpenADefaultComponent(GraphicsExporterComponentType, kQTFileTypeTIFF,
                       &exporter);
        if (err) goto bail;
        
        // 入力ソースを設定する
        err = GraphicsExportSetInputGWorld(exporter, gworld);
        if (err) goto bail;
    
        // エクスポート先を設定する
        err = GraphicsExportSetOutputFile(exporter, &theFSSpec);
        if (err) goto bail;
        
        // エクスポート深度を設定する。QA1354 の表 1 を参照
        err = GraphicsExportSetDepth(exporter, k24RGBPixelFormat);
        if (err) goto bail;
    
        // ファイルをエクスポートする
        GraphicsExportDoExport(exporter, &actualSizeWritten);
    }
    
bail:
    
    if (importer) CloseComponent(importer);
    if (exporter) CloseComponent(exporter);
    if (gworld) DisposeGWorld(gworld);
}

参考資料:

先頭に戻る

ドキュメントの改訂履歴

日付メモ
2004-06-03最初のバージョン

掲載日: 2004-06-03