LoginSignup
2
2

More than 5 years have passed since last update.

GPUImagePictureで透過画像を合成すると灰色になっちゃうよー問題

Posted at

GPUImage便利ですね。

そんな便利なGPUImageですが、透過PNG画像を合成させると灰色になってしまう、というハマりポイントがあります。

具体的には、こんなコードを書いてしまうと(細部は省略)

sourceOverBlendFilter = [[GPUImageSourceOverBlendFilter alloc] init];
overlayPicture = [[GPUImagePicture alloc] initWithImage:overlayImage];

[source addTarget:sourceOverBlendFilter];
[sourceOverBlendFilter addTarget:self.movieWriter];
[overlayPicture addTarget:self.sourceOverBlendFilter];
[overlayPicture processImage];

こんな画像を合成させたのに、
nice.png

こんなになっちゃうことがあります。
dame.png

これはなぜかというと、この画像のビットマップ配列がkCGImageAlphaPremultipliedFirstになっているのですが、GPUImagePictureはそのままテクスチャにしてしまうので、プレマルチではない(=ストレートな)ビットマップを期待するOpenGL ES側で合成すると、そのまま計算されて灰色がかかってしまっています。
(プレマルチプライドアルファについては 例えば http://www.nekomataya.info/nekojyarashi/wiki.cgi?AlphaMode#i3 とか)

これは既知の問題で、Issueにも上げられていてマージ済です。ですので、上のコードのGPUImagePictureを作っている部分を

overlayPicture = [[GPUImagePicture alloc] initWithImage:overlayImage smoothlyScaleOutput:NO removePremultiplication:YES];

このように書き換えれば治るようなきがするのですが、治らない!!
このPRをよく読むと、kCGBitmapByteOrder32Littleの時に動かないバグがあるのでパッチを書きました。

https://github.com/shnjp/GPUImage/commit/93577b04980aadedbb71938bcec114723e42f1ac
 
やった!できた!
 
おしまい。   

GPUImageはPR溜まり過ぎじゃよ

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2