2

CGImage (コア グラフィックス、C/C++) があります。グレースケールです。まぁ、元々は白黒だったのですが、CGImage は RGB かもしれません。それは問題ではありません。CCITT-Group 4 TIFF を作成したいと考えています。

正しい辞書を使用して宛先を作成し、画像を追加することで、LZW TIFF (グレースケールまたはカラー) を作成できます。問題ありません。

ただし、CCITT-4 を表す同等の kCGImagePropertyTIFFCompression 値はないようです。4 のはずですが、圧縮されていません。

私は手動の CCITT 圧縮ルーチンを持っているので、バイナリ (ピクセルあたり 1 ビット) データを取得できれば準備完了です。しかし、CGImage から 1 つの BPP データを取得できないようです。CGImage を CGBitmapContext に入れてからデータを提供するコードがありますが、すべて黒くなっているようです。

私は今日これを理解しようとしていくつか質問をしましたが、私が本当に答えてほしい質問をして、誰かがそれに答えられるかどうか見てみましょう.

これを行う方法があるはずです。私はばかげた何かが欠けている必要があります。それは何ですか?

4

3 に答える 3

3

これは機能しているようで、真っ黒ではない出力が生成されます。最初に手動でグレースケールに変換する必要のない方法があるかもしれませんが、少なくともうまくいきます!

static void WriteCCITTTiffWithCGImage_URL_(CGImageRef im, CFURLRef url) {
    // produce grayscale image
    CGImageRef grayscaleImage;
    {
        CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericGray);
        CGContextRef bitmapCtx = CGBitmapContextCreate(NULL, CGImageGetWidth(im), CGImageGetHeight(im), 8, 0, colorSpace, kCGImageAlphaNone);
        CGContextDrawImage(bitmapCtx, CGRectMake(0,0,CGImageGetWidth(im), CGImageGetHeight(im)), im);
        grayscaleImage = CGBitmapContextCreateImage(bitmapCtx);
        CFRelease(bitmapCtx);
        CFRelease(colorSpace);
    }

    // generate options for ImageIO. Man this sucks in C.
    CFMutableDictionaryRef options = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    {
        {
            CFMutableDictionaryRef tiffOptions = CFDictionaryCreateMutable(kCFAllocatorDefault, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
            int fourInt = 4;
            CFNumberRef fourNumber = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &fourInt);
            CFDictionarySetValue(tiffOptions, kCGImagePropertyTIFFCompression, fourNumber);
            CFRelease(fourNumber);

            CFDictionarySetValue(options, kCGImagePropertyTIFFDictionary, tiffOptions);

            CFRelease(tiffOptions);                
        }

        {
            int oneInt = 1;
            CFNumberRef oneNumber = CFNumberCreate(kCFAllocatorDefault, kCFNumberIntType, &oneInt);

            CFDictionarySetValue(options, kCGImagePropertyDepth, oneNumber);

            CFRelease(oneNumber);
        }
    }

    // write file
    CGImageDestinationRef idst = CGImageDestinationCreateWithURL(url, kUTTypeTIFF, 1, NULL);
    CGImageDestinationAddImage(idst, grayscaleImage, options);
    CGImageDestinationFinalize(idst);

    // clean up
    CFRelease(idst);
    CFRelease(options);
    CFRelease(grayscaleImage);
}


Nepheli:tmp ken$ tiffutil -info /tmp/output.tiff 
Directory at 0x1200
  Image Width: 842 Image Length: 562
  Bits/Sample: 1
  Sample Format: unsigned integer
  Compression Scheme: CCITT Group 4 facsimile encoding
  Photometric Interpretation: "min-is-black"
  Orientation: row 0 top, col 0 lhs
  Samples/Pixel: 1
  Number of Strips: 1
  Planar Configuration: Not planar
于 2009-04-27T10:22:16.687 に答える
1

NSBitmapImageRep は、CCITT FAX Group 4 圧縮 TIFF を生成できると主張しています。したがって、次のようなことがうまくいくかもしれません(テストされていません):

CFDataRef tiffFaxG4DataForCGImage(CGImageRef cgImage) {
  NSBitmapImageRep *imageRep =
      [[[NSBitmapImageRep alloc] initWithCGImage:cgImage] autorelease];
  NSData *tiffData =
      [imageRep TIFFRepresentationUsingCompression:NSTIFFCompressionCCITTFAX4
                                            factor:0.0f];
  return (CFDataRef) tiffData;
}

この関数は、求めるデータを返す必要があります。

于 2009-04-27T09:29:50.697 に答える
1

ImageMagickは、ほぼすべての画像形式との間で変換できます。オープン ソースであるため、ソース コードを読んで質問に対する答えを見つけることができます。

C++ を使用している場合は、アプリでImageMagick APIを使用することもできます。

編集:
CGImage から任意の形式でデータを取得できる場合 (そして、できるように聞こえた場合)、ImageMagick を使用して、CGImage から取得した形式から、ImageMagick でサポートされている他の形式 (目的の TIFF 形式) に変換できます。 )。

編集: 技術的な Q&A QA1509 CGImage オブジェクトからピクセル データを取得すると、次のようになります。

Mac OS X 10.5 以降では、CGImage オブジェクトから実際のピクセル データを取得できる新しい呼び出しが追加されました。この呼び出し CGDataProviderCopyData は、対象の画像のピクセル データを含む CFData オブジェクトを返します。

ピクセル データを取得したら、ImageMagick を使用して変換できます。

于 2009-04-16T23:56:00.017 に答える