27

Apple プラットフォームの色空間間で色を変換することについて尋ねる質問がいくつかあります。残念ながら、答えには、OS X と iOS で互換的に使用できない移植性のない Objective-C クラスが含まれることがよくありNSColorますUIColor

ですから、そこに良い答えがあるに違いないと確信している非常に具体的なことをお聞きしたいと思います. Apple がこれの必要性を予見していなかったとは信じられません。

移植可能な Core Graphics 関数のみを使用しながら、CGColorすべてのタイプをサポートする一般的な方法で、ある色空間 (モノクロなど) から別の色空間 (RGB など) に変換するにはどうすればよいでしょうか?CGColorSpace


いくつかのコンテキスト。オンライン サービスが提供する値に、 に格納されている値を掛ける必要がありますUIColor。最終的にメソッドを導入した iOS5 以前の RGB コンポーネントを抽出する正しい方法-[UIColor getRed:green:blue:alpha:]は、 を使用することCGColorGetComponents()です。次に、この色にオンライン サービスから取得した色を掛けます。+[UIColor grayColor]を生成するために が使用された場合、これは失敗しますUIColor。つまり、色をグレースケール色空間から RGB に変換する必要があります。この場合は簡単です。提供されている他の色空間についてはどうですか?または、理論的な将来のシナリオで、単一のピクセルの色を処理したい場合はどうなりますか?

ピクセルをビットマップ コンテキストにペイントしてから、このピクセルを読み取るという提案がどこかにあります。それは非常識です。これが唯一の方法ではないことを願っています。明らかに、描画メソッドは変換を実行する方法を理解できます。ピクセルを描画するためだけにビットマップ コンテキストを作成せずに、これをどのように活用できますか?


追加の調査:

  • 色変換に関するこの記事UIColorでは、 の文書化されていない/非公開の方法は別-styleStringとして、文書化されていない についても興味深いことに言及していますCGColorTransform
  • WebKit の ColorCG.cppは、という名前のヘッダーがあることを示唆していCoreGraphics/CGColorTransform.hます。残念ながら、少なくとも Mountain Lion には、このヘッダーは存在しません。なぜ Apple はこれらの API を隠すのでしょうか?
  • 私が見つけた s に言及している唯一の賢明なリソースCGColorTransformは、Core Graphics のフリー/オープン ソース再実装である FreeQuartz です。

CGColorTransform. _ とはいえ、私は息を止めていないので、他に賢明な提案があれば、私はすべて耳を傾けます.

4

3 に答える 3

6

公開を要求した rdar #12141580 に対する Apple の公式の回答CGColorTransform:

フィードバックをお寄せいただきありがとうございます。

エンジニアリングは、次の情報に基づいて動作が変更されないと判断しました。

カラーシンクを使用します。

この問題の解決に関して質問がある場合は、バグ レポートをその情報で更新してください。

現在、このバグ レポートは終了しています。

この問題に影響を与える可能性のあるアップデートがないか、Apple の新しいリリースを定期的に確認してください。

その回答を書いた人は誰でも、決定を非常に詳細に説明しなければならないと感じた. 特に、ColorSync などの非常に複雑な API の使用を推奨する決定。

于 2013-05-24T20:29:17.993 に答える
4

質問では、色を変換するためだけに作成されたビットマップ コンテキストでの描画を避けたいと明示的に述べていますが、私は気づかず、これを思いつきました。

この質問につまずく可能性があり、一時的なビットマップを描画して変換を行う方法を知りたい人のための参考としてこれを残します

CGColorRef source;
CGColorSpaceRef targetColorSpace;
int components = CGColorSpaceGetNumberOfComponents(targetColorSpace);
CGFloat temp-buffer[components];
CGContextRef temp-bmp = CGBitmapContextCreate(
    temp-buffer,
    1,1,8 * sizeof(CGFloat),components,
    targetColorSpace,
    kCGBitmapFloatComponents );
CGContextSetFillColorWithColor(temp-bmp,source);
CGContextFillRect(temp-bmp,CGRectMake(0,0,1,1));
CGColor target = CGColorCreate(targetColorSpace,temp-buffer);

/* then you cleanup and destroy created objects */

このコードは試していません。修正が必要になる可能性があります。

于 2012-09-08T23:08:47.093 に答える