「開発人」さんからのコメント

CGImageGetDataProvider

 を使う方法は実機では色が変になるってことがわかりました。
 ど~もRGBAの並び順がエミューレータと実機で違うみたい。

エミューレータ:赤、緑、青、アルファの順
実機:青、緑、赤、アルファの順

 デバイスに最適な並び順になってるんでしょうな。

 #ifdefで実機とエミューレータは区別つくので、並び順を差し替えること自体は難しくはないんだけど、なんかスマートじゃないんだよね。それに実機が、ずっとこの並び順になってる保証も無いし...
 なんせ68K→PowerPC→Intelと鬼のようにプラットフォームを乗り換えるAppleだから...
 で、スマートなのはAppleのやり方で、AppleのサンプルがCGBitmapContextCreate、CGContextDrawImageという回りくどい方法を取ってたのは伊達じゃなかったわけですな。
 ただ~し、このままだとアルファで加工されちゃうので、これを避ける方法を調べてみました。
 どうやら

CGContextDrawImage

 の前に

CGContextSetBlendMode

 で

kCGBlendModeCopy

 を指定すればいいみたいです。

 つーことで、ソースesUtils.m/hのみをアップしときます。
 TIFのグレー画像やCMYK画像のRGBテクスチャ化もついでにサポートだああ。


 と、調子乗ったのはいいけど、コメントにあるように先祖帰りおこしてますた。
 実機側のUIImage imageWithContentsOfFileは、読み込み時にアルファ値を元画像に適用するみたいでCGDataProviderCopyDataで取り出したRGB自体がすでに以下の状態でした。

テン・シー・シー-4

 だめだわ。こりゃ。
 回避策としては「開発人」さんが紹介してくれたライブラリを使ってのPNG独自読み込みしかないみたいです。

ライブラリソース

 差し替えソースでは、上記ソースstb_image_custom.h/cをプロジェクトに組み込んでesUtils.cの


#define USE_OWN_PNG_LOADER 0

 を

#define USE_OWN_PNG_LOADER 1

 にすれば、実機でもアルファ付きPNGを読み込めるようにしました。
 注)「プロジェクト>プロジェクト設定を編集」メニューでビルド設定 Compress PNG Files をOFFにする必要あり。
 実際、実機でちゃんと動いてくれました。

 ちなみに「iPhoneアプリ開発、その(107)」で紹介したPowerVR用テクスチャ画像は実機でもちゃんと動きます。

------------
差し替えソース:newESUtils.zip ← ×
差し替えソース:newnewESUtils.zip