2011-06-28 19 views
4

トップイメージのHardLightブレンドモードを使用して、iPhoneアプリケーションで2つのイメージをブレンドします。これは次のようになります。ハードライトブレンドモードを使用した場合のハイライトアーティファクト

UIGraphicsBeginImageContext(size); 
[sourceImage drawInRect:rectangle blendMode:kCGBlendModeNormal alpha:1.0]; 
[effectOverlay drawInRect:rectangle blendMode:kCGBlendModeHardLight alpha:0.75]; 
mainImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

うまくいきます。しかし、画像の吹き飛ばされたハイライトは奇妙な色のアーティファクトで現れる。この写真の右下隅にある紫アーティファクトに注意してください。

http://dl.dropbox.com/u/626891/artifact.jpg http://dl.dropbox.com/u/626891/artifact.jpg

これはハードライトを使用して発生します。他のブレンドモードは問題ありません。誰でもこれについて何をすべきか知っていますか?

+0

何が起こっているか考えている人はいませんか? – cdstamper

+0

私はまったく同じ問題を抱えています。ハードライトブレンディングの結果、奇妙なアーティファクトが発生します。 Hard Lightとのシンプルな2レイヤーのブレンドはPhotoshopでもうまくいきます。しかし、私はどの色と混合しているかに応じて、iOSで変なアーティファクトを取得します。 – LucasTizma

+0

同じ問題がここにあります! ** kCGBlendModeHardLight **を使用する場合、alphaは1.0ではない。 GIMP 2.8とは異なる結果! – Nianliang

答えて

2

この問題は非常に厄介です。誰かがAppleにバグ報告をしましたか?

それにもかかわらず、私はここで見ているアドホックなアプローチよりも問題をより確実に解決するのに適しているもう一つの回避策があります。ブレンドモードのHardLightはオーバーレイと同じで、2つの引数が切り替えられていることを知っておくと便利です。そして、物事は、オーバーレイのiOS実装がバグではないであるということです。そのため、あなたは2つのイメージを切り替えられた順序で描画するように、図面を移動する必要があります(UIGraphicsGetImageFromCurrentImageContextなどを使用して中間スナップショットを撮るなど)。この方法で、HardLightの代わりにOverlayを使用することができます。このことができます

UIGraphicsBeginImageContext(size); 
    [effectOverlay drawInRect:rectangle blendMode:kCGBlendModeNormal alpha:0.75]; 
    [sourceImage drawInRect:rectangle blendMode:kCGBlendModeOverlay alpha:1.0]; 
    mainImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

希望:

だから、あなたたとえばにコードを変更します。

+0

完璧なソリューション!明らかに、255,255,255を探して各ピクセルを254,254,254に変更するよりもはるかに良い([リンク](http://www.iphonedevsdk.com/forum/iphone-sdk-development/84420) -weird-artifacts-when-hard-light-blend-mode.html#post409815))。 – Nianliang

+0

これは本当に(255,255,255)に対してのみ発生しますか(純粋な白など)?私は純粋な黄色(255,255,0)と純粋な緑(0,255,0)でゴミのアーティファクトを見ていたと確信しています。いずれの場合でも、kCGBlendModeHardLightの代わりにkCGBlendModeOverlayを使用するようにコードを変更しましたが、現在正しく動作するだけでなく、より速く動作します。照明画像の上に色付けを適用することができます。私の場合は、巨大なビットマップ操作操作が1つ少なくなります。 –

1

これはおそらく色空間の問題であることが確認できました。 Opacityというアプリを使って、シェイプ、ブレンドエフェクト、シャドウなどを視覚的に作成し、その結果をCore Graphicsコードにエクスポートします。私はHard Lightブレンドモードを使用していましたが、Opacityではすべてがうまく見えました。しかし、iOS上でコードをエクスポートして実行したところ、同じアーティファクトが発生していました。

これはまさに解決策ではありませんが、私の場合は、単色で塗りつぶして、上の画像(ハードライト)とブレンドしていました。 これらのアーチファクトは、輝度が100%である塗りつぶしの色でのみ発生していることに気付きました。明るさを99%に設定することで、私の特定の問題が解決しました。しかし、イメージやものをブレンドするためには、色空間で遊ぶ必要があると思います。

私は間違っている可能性があります。私は確かに色の専門家ではない。

2

kCGBlendModeColorで類似のアーティファクトが発生しています。私はそれが色空間の問題だとは思わない。ピクセル値を計算するときにiOSが255でクランプしていないように見えます。間違いなくOSのバグ。それは、画像処理のようなソリューション/回避策を見つけ101

+1

これは間違いなく問題です。非常に非常に単純なバグ。 – cdstamper

1

だから、悲しい...

ちょうどあなたのイメージを通過し、254254254に255,255,255だとあなたがアーティファクトは表示されません任意のピクセルを変更します。

ちょうど私のために働いた。

明らかに、私のケースでは、色を付ける画像を持つコンテキストと、kCGBlendModeColorでCGDrawImageを使用して色を付ける色を含むCGImageがあります。コンテキストから一時的なイメージを作成し、255,255,255を探して各ピクセルを254,254,254に変更します。次に、イメージをコンテキストに戻し、kCGBlendModeColorで色合いのイメージを描画します。大丈夫だよー。

希望に役立ちます。

0

私はkCGBlendModeNormalで同じ問題がありました。

- (UIImage *)overlayImage:(UIImage *)image withBlendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha 
{ 
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height); 
UIGraphicsBeginImageContext(self.size); 
CGContextSetInterpolationQuality(UIGraphicsGetCurrentContext(), kCGInterpolationHigh); 
[self drawInRect:rect blendMode:kCGBlendModeNormal alpha:0.99]; 
[image drawInRect:rect blendMode:blendMode alpha:alpha * 0.99]; 
UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return result; 
} 

はアルファのための0.99の最大値を使用して、私は255、255、255 Iとの任意のピクセルを持っていないことを保証します。私は、特定のアルファおよび特定のブレンドモードと2枚の画像を重ね合わせた方法を持っていましたこれが役立つことを願って

関連する問題