2009-11-10 10 views
12

基本的に、Webサーバーからイメージをダウンロードしてディスクにキャッシュしますが、その前にマスクします。私は、マスキングコード皆を使用してい を指すように思われるここで見つけることができます: 、しかしたまたま画像が細かい表示されていることですが、どのようなhttp://iosdevelopertips.com/cocoa/how-to-mask-an-image.htmlマスクされたイメージをPNGファイルとしてディスクに書き込む

UIImage *img = [self maskImage:[UIImage imageWithData:data] withMask:self.imageMask]; 
[UIImagePNGRepresentation(img) writeToFile:cachePath atomically:NO]; 
でディスクに書き込まれますバージョン

は、後で表示されるものと比較するとアルファチャンネルが反転しています(ここでは同じUIImageインスタンスを使用しています)。

アイデア?キャッシュされたバージョンをマスクする必要があります。そうしないと、毎回マスクする必要がある場合、テーブルビューで画像を表示するのが非常に遅くなります。

編集:そうです、UIImagePNGRepresentation(img)はアルファチャンネルを逆転させるようですが、ディスクに書き込むコードとは関係ありませんが、とにかくチェックしました。

+0

UIImageJPEGRepresentationを使用しても同じ結果になりますか?私はあなたがJPEGに切り替えることを示唆していません。同じ効果があるかどうかは疑問です。 –

+0

私はしようとしますが、JPEGはアルファマスクを持っているという目的を破っています。 –

+0

奇妙なことに、JPEGがうまく見えて、マスクが正しく適用されています。 –

答えて

5

CGImage ReferenceCGImageCreateWithMaskに説明を参照してください:

得られた画像は、マスクパラメータは、画像マスクまたは画像であるかどうかに依存します。 マスクパラメータがイメージマスクである場合、イメージマスクのソースサンプルは逆アルファ値として機能します。つまり、イメージマスク内のソースサンプルの値がSである場合、イメージ内の対応する領域は、(1-S)のアルファ値を使用してデスティネーションとブレンドされます。たとえば、Sが1の場合、領域はペイントされず、Sが0の場合は領域が完全にペイントされます。

マスクパラメータがイメージの場合は、イメージを宛先にブレンドするためのアルファマスクとして機能します。 mask 'のソースサンプルはアルファ値として機能します。マスク内のソースサンプルの値がSである場合、イメージ内の対応する領域は、Sのアルファでデスティネーションとブレンドされます。たとえば、Sが0の場合、領域はペイントされず、Sが1の場合、その地域は完全に塗装されています。

イメージマスクは保存中にマスクするためにmask imageと扱われているようです。よると:

  1. 使用画像マスクの逆バージョン:

    正しくUIImagePNGRepresentationで保存するには、いくつかの選択肢があります。

  2. 「イメージマスク」の代わりに「マスクイメージ」を使用します。
  3. 前述のepatelのように、ビットマップコンテキストにレンダリングして保存します。
0

この記事を見ましたか?わからないことは、関連するのですが、新しいイメージに描画について

Any idea why this image masking code does not work?

+0

私はマスク作成の特異性をよく知っていて、マスクなどのいくつかの異なるフォーマットでテストしたので、関連性がないようです。さらに、マスクされたイメージを保存するときディスクはアルファチャンネルが反転されます。 –

14

どのように似ているし、そのを保存しているようですか?

UIGraphicsBeginImageContext(img.size); 
[img drawAtPoint:CGPointZero]; 
UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
[UIImagePNGRepresentation(newImg) writeToFile:cachePath atomically:NO]; 

(未テスト)

+0

うん、それは動作します。これは理想的ではありません。私の(非常に粗い)測定結果によると、Core Graphicsコマンドを使用してイメージを最初から描画するよりも、上記のコード( '-writeToFile:atomically'を引いたもの)なぜあなたの提案がうまくいくのか、そして同じことをやるより効率的な方法があるかどうかについてのさらなる洞察はありますか? – Stuart

+0

私の推測によれば、マスクは画像とは別の「物」です。何かUIKit/Quartzが扱うことができますが、マスクをアルファチャンネルとしてイメージとして保存する場合は、保存する前に最終的な "ビットマップ"を取得するためにイメージをマスクと合成する必要があります。 – epatel

+0

@epatel私はあなたを愛しています。私の髪を引き出していた。通常のコードをファイルから読み込み(ビューを表示するたびにマスクするのではなく)、マスクしてファイルに保存しようとしています。私の "UIImage * maskedIcon = [UIImage imageWithCGImage:maskedImageRef]; "それを機能させる。ありがとうございました! –

関連する問題