Androidで画像を読み込むときの注意

最近Androidでゲームアプリを作っていて、Rokonというフレームワークを使っている。ということで、画像を読み込むときの問題ってのはRokonにあるのかも知れないのだけど。

PNG画像を読み込むときに以下の様なエラーがlogcatに出力されていて、画像が読み込まれていない様子だった。

07-31 16:56:28.772: ERROR/Rokon(2060): Loading TextureAtlas
07-31 16:56:28.772: WARN/System.err(2060): java.lang.Exception: Loading TextureAtlas
07-31 16:56:28.772: WARN/System.err(2060):     at com.stickycoding.rokon.Debug.error(Debug.java:71)
07-31 16:56:28.782: WARN/System.err(2060):     at com.stickycoding.rokon.TextureAtlas.onLoadTexture(TextureAtlas.java:163)
07-31 16:56:28.782: WARN/System.err(2060):     at com.stickycoding.rokon.GLHelper.checkTextureValid(GLHelper.java:206)
07-31 16:56:28.782: WARN/System.err(2060):     at com.stickycoding.rokon.GLHelper.bindTexture(GLHelper.java:189)
07-31 16:56:28.782: WARN/System.err(2060):     at com.stickycoding.rokon.GLHelper.drawNormal(GLHelper.java:366)
07-31 16:56:28.792: WARN/System.err(2060):     at com.stickycoding.rokon.DrawableObject.onDrawNormal(DrawableObject.java:382)
07-31 16:56:28.792: WARN/System.err(2060):     at com.stickycoding.rokon.DrawableObject.onDraw(DrawableObject.java:360)
07-31 16:56:28.792: WARN/System.err(2060):     at com.stickycoding.rokon.Layer.onDraw(Layer.java:138)
07-31 16:56:28.792: WARN/System.err(2060):     at com.stickycoding.rokon.Scene.onDraw(Scene.java:934)
07-31 16:56:28.792: WARN/System.err(2060):     at com.stickycoding.rokon.RokonRenderer.onDrawFrame(RokonRenderer.java:40)
07-31 16:56:28.792: WARN/System.err(2060):     at com.stickycoding.rokon.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1112)
07-31 16:56:28.792: WARN/System.err(2060):     at com.stickycoding.rokon.GLSurfaceView$GLThread.run(GLSurfaceView.java:946)
07-31 16:56:28.802: VERBOSE/Rokon(2060): @@ bind 3
07-31 16:56:28.912: DEBUG/dalvikvm(2060): GC freed 1246 objects / 48464 bytes in 106ms
07-31 16:56:29.772: WARN/System.err(2060): java.lang.IllegalArgumentException: Unknown type
07-31 16:56:29.772: WARN/System.err(2060):     at android.opengl.GLUtils.getType(GLUtils.java:71)
07-31 16:56:29.782: WARN/System.err(2060):     at android.opengl.GLUtils.texSubImage2D(GLUtils.java:177)
07-31 16:56:29.782: WARN/System.err(2060):     at com.stickycoding.rokon.TextureAtlas.onLoadTexture(TextureAtlas.java:184)
07-31 16:56:29.782: WARN/System.err(2060):     at com.stickycoding.rokon.GLHelper.checkTextureValid(GLHelper.java:206)
07-31 16:56:29.792: WARN/System.err(2060):     at com.stickycoding.rokon.GLHelper.bindTexture(GLHelper.java:189)
07-31 16:56:29.792: WARN/System.err(2060):     at com.stickycoding.rokon.GLHelper.drawNormal(GLHelper.java:366)
07-31 16:56:29.792: WARN/System.err(2060):     at com.stickycoding.rokon.DrawableObject.onDrawNormal(DrawableObject.java:382)
07-31 16:56:29.792: WARN/System.err(2060):     at com.stickycoding.rokon.DrawableObject.onDraw(DrawableObject.java:360)
07-31 16:56:29.792: WARN/System.err(2060):     at com.stickycoding.rokon.Layer.onDraw(Layer.java:138)
07-31 16:56:29.792: WARN/System.err(2060):     at com.stickycoding.rokon.Scene.onDraw(Scene.java:934)
07-31 16:56:29.792: WARN/System.err(2060):     at com.stickycoding.rokon.RokonRenderer.onDrawFrame(RokonRenderer.java:40)
07-31 16:56:29.802: WARN/System.err(2060):     at com.stickycoding.rokon.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1112)
07-31 16:56:29.802: WARN/System.err(2060):     at com.stickycoding.rokon.GLSurfaceView$GLThread.run(GLSurfaceView.java:946)

まったく意味が分からなかったのだけど、いろいろ調べてみたら画像ファイルが「インデックスカラー」で保存されているこうなるらしい。なにそれ。

とりあえず、問題の画像をGimpで開くとタイトルバーに↓こんなふうに出ているはず。

test.png-5.0 (インデックス, 1枚のレイヤー) 256 x 256 - GIMP

そこで、Gimpのメニューから「画像」>「モード」>「RGB」を選択して変換する。タイトルバーには以下のように表示されるはず。

test.png-5.0 (RGB, 1枚のレイヤー) 256 x 256 - GIMP

はまるねこれは。