1

色のパレットへのインデックスを使用する一連の PNG 画像があります (PNG カラー タイプ 3)。場合によっては、パレットのエントリの一部が変更された画像のコピーを作成する必要があります。このようにして、ソース PNG の色を何度も変更します。

Java では、これは から RGB 値を取得し、IndexedColorModel値を変更して新しいIndexedColorModelを作成BufferedImageし、ソース イメージのラスター データと新しいカラー モデルを使用して新しい を作成することによって処理されます。

Actionscript では、PNG バイトを裸の として読み込みByteArray、パレット チャンクを見つけ、値を変更し、ランタイムに から画像をロードさせる必要がありましたByteArray

私は現在、MonoTouch (私は初めてです) を介して iOS 用に同じシステムを実装しようとしていますが、壁にぶつかりました。Actionscript のアプローチはここでもうまくいくと思いますが、今回はそれほど低いレベルでの作業は避けたほうがよいでしょう。

から開始する場合UIImage、 で色空間を取得できますUIImage.CGImage.ColorSpace。インデックス付きカラー モデルであることを確認できますcolorSpace.Model。私が確信していないのは、パレットバイトの実際の配列を取得する方法です。

反対に、新しいパレットを使用して新しい画像を作成するにはどうすればよいですか? CGImage.WithColorSpaceそれは私が望むことをするように見えます...多分?次に、新しいパレットで色空間を作成できるようにする必要があります。表面的には、希望どおりに見えますが、パラメーターがCGColorSpace.CreateIndexedどのように使用されているかわかりません。baseSpace私が提供するまったく新しいカラー パレットで を作成しCGColorSpace、新しいパレットで元の画像のインデックスを使用したいと考えています。多分私は何CGColorSpaceのために使われるかを正確に誤解しています。

4

1 に答える 1

1

Actionscript では、PNG バイトを裸の ByteArray として読み込み、パレット チャンクを見つけ、値を変更してから、ランタイムに ByteArray から画像をロードさせる必要がありました。

それは少し野蛮ですが、うまくいくでしょう。ただし、CoreGraphics には、これを回避するために必要なものがすべて揃っていると確信しています。

UIImage から開始する場合

とにかく CoreGraphics (CG) を使用するので、CGImage. サンプル コード (objc) はこちら: iPhone SDK: インデックス付きカラー PNG 画像へのアクセス

私が確信していないのは、パレットバイトの実際の配列を取得する方法です。

CGColorSpaceGetColorTable完璧な候補のようです。ただし、MonoTouch バインディングから欠落しているように見えますが (確認します)、手動でバインドしてアプリケーションで使用するのは簡単です (ap/invoke です)。

しかし、baseSpace パラメータがどのように使用されているかは不明です

CGColorSpace.CreateIndexednullのパラメーターを受け入れることbaseSpaceができますが、元の PNG 画像から同じベースの GCColorSpace をコピーする方がよい場合があります。

于 2012-04-19T13:25:30.633 に答える