アタリ用ツールver0.1(AndroidとFlash)をUP

=前置き=

 スマホ用格ゲーのグラフィックを作成するにあたり、ちゃんとサイズなどを一定にしたかったので、MMDのモデルを使ったアタリ用のツールを作ってみた。

=アプリ=

 ストアに上げるには完成度がアレなので、野良apkとしてUP。インストールするためには開発者用のデバッグ機能とかをオンにする必要がある。

MmdViewer.apk

 Air製だがAir固有の処理は使っていないため、Flashでも動作確認可能。(wmodeとかの指定のため、生FlashではなくHTMLまでセットで必要)

http://healer-games.appspot.com/mmd_viewer/index.html

=概要=

 MMDのモデルの各パーツの傾きをスライダーで設定してポーズを作り、pngとして保存するだけのツール。

 アタリをとることに特化しているため、設定できるパーツは最小限になっており、UIも最低限の見た目になっている。apkのアイコンも体験版集のものをそのまま流用している。

 モデルはmato.sus304 Blender Notesさんのものを使わせてもらった。

=操作=

 UI側のスライダーを操作することでパーツを回転。UIは上下にスライド可能(スマホ操作ベース)。モデル側を左右にスライドすると表示をY軸回転。

 右上の白い四角がメニューボタンになっており、ここからpngとして保存が可能。

=予定=

 明日から一週間の夏季休暇に入り、その間は普通に休んでいる予定なので特に作業はしない予定(絵描きの練習はするかもしれないが)。

 今回のツールに関しては、腕まわりの設定がまだ煩雑なのでここは近いうちに変更予定。あと、apkの保存ファイル名の「X月」に相当する部分が-1されてるのでこれも近いうちに修正予定。

 また、アタリのための専用モデルを自作したいところだが、これは単純に時間がかかるのでやるとしてもかなり先(来年以降?)になる予定。

 ツール作成の際にあれこれ詰まったので、そこらへんの技術的なこともあとでUPする予定。

 それ以降の予定は未定。おそらくスマホ用格ゲーの作成を再開すると思うが、体調などを見てまた変えるかもしれない。

すれちがいシューティングのハイスコアTips

=前置き=

 「とりあえず何か書いてみる」シリーズ2つ目。休憩中にすれちがいシューティングの1位の座を一通り取り返していたので、すれちがいシューティングでハイスコアをとるためのアレコレを書いてみようと思う。

 ハイスコアを狙う場合はダイアの全回収が必須だが、そこらへんの説明はすれちがいシューティング/ステージ - すれちがいMii広場 攻略まとめwiki - アットウィキの方に任せる。ここではそれ以外の立ち回りについて書く。

 後半になるほどパターンが確立していないので、雑だったり信憑性が低かったりするので注意。

 そして最近になってまた1位の座をあれこれ奪われてしまったので、その人のスコアも併記してみる。(書いてない場合は自分が1位)

=1-1=

 このステージではとにかく「全ての宝石・ダイアを集める」「全ての敵を倒す」「全てのブロックを壊す」を徹底するだけ。途中で左下にちょろっと出てくるだけの敵も見逃さずに。ブロックに囲まれたところも、まずは上を早めに片付けてから戻ってブロックを壊し始めれば上下ルートともに回収できる。

 装備は青・水色・黄緑など広範囲・サーチ系で固めればだいたいなんとかなるはず。

(自分のハイスコア:36160)
(他人のハイスコア:36560)

=1-2=

 このステージも全て倒すのが目標。上昇中に左右の分岐があるが、先に早めに「右のブロックを破壊→ダイア獲得」してから下を通って左に戻ればなんとか左の敵を倒すのも間に合う(ブロックを早く壊せる装備と、左の敵を遠くから倒せる装備が欲しい)。

 1-1と同様、青・水色・黄緑などで固めればだいたいなんとかなる。

(自分のハイスコア:47660)
(他人のハイスコア:47760)

=1-3=

 このステージでもやはり全て倒すのが目標。分岐はないが途中で大量に敵が出てくるので、そこをちゃんと倒しきるのが重要になってくる。

 装備はやはり青・水色・黄緑を推奨。無敵アイテムが出たあとのラッシュをちゃんと全滅させるため、青・水色・黄緑のメンツが4人以上の時にやった方が良いかもしれない(コインだけだとやや不安)。

(自分のハイスコア:39210)
(他人のハイスコア:39610)

=2-1=

 このステージではとにかくあちこちの宝石を回収しつつブロックをできるだけ壊す。終盤で大量にブロックが降ってくるところも、宝石を回収しつつ可能な限り降ってくるブロックを壊す。ボス戦ではブロックを壊してもスコアにはならないので普通に倒す。(一応ボスのオプションから先に倒している)

 装備は、ブロックを壊しやすく狭い場所でも盾として使えるので安心な白と、斜めに撃ってもムダになりにくいピンクあたりが良さそう。あとはブロックを少しでも多く壊すため、火力のある装備があると良い(広範囲・サーチ系は火力が低いので注意)。

(自分のハイスコア:34710)
(他人のハイスコア:34710)

=2-2=

 このステージでは早めに敵を倒すと敵が追加で出てくる(いわゆる早回し)という処理になっているので、基本的には敵が出てきたらすぐに全滅させるのが望ましい。特に最後の上と右から出てくるところは無敵アイテムやメンバーを回収してからだと遅いので、「右のやつを倒す→無敵アイテムとメンバーの回収」という流れにする必要がある。

 あとは移動の際に4隅の全ての宝石やメンバーを回収するパターンを作ればOK。序盤に多少ムリしてでも回収した方が装備も充実して倒す速度も上がるのでさらに回収に行きやすくなるはず。

 装備は使いやすければだいたいなんでも良いと思うが、赤がザコの殲滅でもボス戦でも一番使いやすいと思う。

(自分のハイスコア:37810)

=2-3=

 ここではとにかく蛇っぽいあいつに黒(ボム)を飲ませまくるのと、分岐で下のルートを通るのが重要。あとはスクロールに気をつけつつ宝石も可能な限り回収する。

 装備は黒ができれば2つくらい序盤に欲しい。黒だけだとザコを倒すのが面倒なので、それ以外のザコ用の装備も1つは欲しいところ。オススメは回収も考えて「黒・黄緑・黒」。

(自分のハイスコア:52060)
(他人のハイスコア:52260)

=3-1=

 ダイアの回収や幽霊への攻撃のために黄緑は必須。特に壁の中の宝石やダイアまで回収するのが重要。途中の無敵アイテムは棺桶の隣のダイアから出てくるため、取得タイミングを早すぎず遅すぎずに調整してその後のラッシュを全滅させるのも重要。また、ボスの同士討ちを狙う時は少し早め(散弾の発射が終わる前くらい)に自機の位置を設定する必要がある。

 装備は回収とザコのために黄緑×2と、ボス戦の同士討ちを狙いやすくするため白が(欲を言えば2つ)欲しい。「黄緑×2+白」のあと、補充で白が入るとベスト。白が1つでも、装備をこまめに切り替えればボスの弾を消しきるのは一応可能。

(自分のハイスコア:50460)
(他人のハイスコア:50760)

=3-2=

 スイッチ可能な分岐が2箇所あるが、ダイアのためにはどちらも攻撃せずにそのままのルートを通る必要がある。また、移動が制限される関係で撃ち漏らしが発生しやすいので、できるだけ広範囲をサポートできる装備が良い。ただ、広範囲を攻撃できるだけだと途中のミニ戦艦がたくさん出てくるところで火力が苦しくなるので、そこでは火力のある装備に切り替えたりメンツをそちらの方向に束ねたり誘導攻撃と合わせて複数の攻撃を当てるなどの対応が必要。

 装備は水が一番ラクだが、途中で攻撃が届かないUFOが出てくるため、青などもあると良い。オススメは「水・青・水」。

(自分のハイスコア:39710)
(他人のハイスコア:39710)

=3-3=

 とにかく観覧車を壊しまくる。中央のコアを破壊する前にまわりのパーツを破壊した方がスコアを稼げるようなので、オレンジなどは控えた方が良さそうだが同時破壊のダイアを回収する場合はオレンジ×2が一番ラクなので悩ましい。ボスのパーツを破壊するとスコアになってるので、全部破壊してから倒す方が良いかも?(未検証)

 装備はパーツの破壊を優先すると赤が良い。また、ボス戦の弾降らしなどは白で打ち消せると安定する。ということで「赤・白・赤」あたりがオススメ。ただ、同時破壊を考えると「オレンジ・白・オレンジ」とかの方が良いのかもしれないし、宝石の回収に意外と時間をとられるので「赤・黄緑・赤」とかでも良いかもしれない。

(自分のハイスコア:44260)

=4-1=

 ここでは水流の流れを避けつつどれだけ宝石回収&敵の殲滅ができるかが重要になってくる。特に終盤の無敵アイテムが出てからは水流の位置を見てちゃんと避けつつ敵をできるだけ多く倒すようにしたい。

 ダイアの回収のため黄緑は必須。終盤の上下の貝を倒すためにピンクも2つ欲しい。ということで「ピンク・黄緑・ピンク」がオススメ。

(自分のハイスコア:48510)(まだ漏れがだいぶあるのでもっといけるはず)

=4-2=

 ここでは敵を全て倒すのはもちろんのこと、泡に入って出てくる宝石もこまめに回収しないとスコアの差がつけにくい。

 装備はザコにもボスにも使いやすい水色をサイドに展開しつつ、黄緑で宝石の回収などをやりやすくすると良いかと思う。ということで「水色・黄緑・水色」を推奨。

(自分のハイスコア:38010)

=4-3=

 戦艦を倒すのに時間がかかると他に手が回らなくなるので、ピンクと他の武器での同時攻撃で早めに倒すようにしたい。オレンジ(Lv.3)があるとさらに撃破しやすい。ちなみにヒトデはくっついてきたところでその装備を他の後ろに回すとハガれてくれるっぽい(倒してもスコアにならないようだが)。

 装備はダイア用の同時破壊なども考えて「ピンク・オレンジ・ピンク」あたりが良いだろうか。(オレンジ2つだと通常時がキツそう)

(自分のハイスコア:48410)

=5-1=

 遮蔽が多いので、黄緑(Lv.3)などがあると攻撃面でも回収面でも有効かと思う。無敵アイテム後の敵の数が多いので、広範囲・サーチ系の武器が多いと安心。回転ノコギリにやられてしまうエネミーを早く倒したり、遠くで定期的に発生するエネミーも倒していく必要がある。

 装備は黄緑とあとは広範囲・サーチ系を主体にすれば良さそう。具体的なオススメの組み合わせは特にない。

(自分のハイスコア:66310)(もうちょいいけるはず)

=5-2=

 回転ギミックの部屋を早く突破してもスコアに影響はないしむしろ宝石が取りにくいので、そこらへん用の装備はあまり考えなくて良い。むしろ全方位から敵が出てきたりするので、撃ち漏らしを減らす方向で装備を整えたい。また、わりと序盤に同時破壊が必要になってくるので、同じタイプの武器が序盤で2つ手に入るようにしておきたい。

 装備は黄緑がやりやすそう。LV3にすれば壁の向こうの敵も倒しやすく宝石も回収しやすい。2つあれば途中の同時破壊も相手の移動を気にせずに攻撃できる。あとはシャッター破壊時などで火力を補うため、白や赤があると良い。オススメは「黄緑・白・黄緑」。

(自分のハイスコア:59909)(1人ミスったりしたのでまだいける)

=5-3=

 敵が多いのでとにかく撃ち漏らしを減らすのが重要。途中の大砲台のところは破壊をしばらく保留にして出てくるザコを倒すなどした方がスコアは稼げると思う。

 装備は、敵弾が多いのでミスを減らすために白があると安心。さらに黄緑があると敵弾を回避しつつの回収がしやすい。というわけで「黄緑・白・黄緑」あたりが安定はしそう(ボス戦がややキツいかもしれないが)。

(自分のハイスコア:67310)
(他人のハイスコア:70907)

=アーケード:ノーマル=

 青・水色・黄緑などの広範囲・サーチ系のメンツが多いと安定する。特にアーケード版では無敵アイテムが出てこないので、そこでの敵ラッシュをできるだけ広範囲系の武器で乗り切りたい。

 ノーミスで全クリするのは難しく、コインを使ってもメンツの色の指定は3人分までしかできないため、広範囲系のメンツがたまたま多かった時にやるのが良いかと思う。

(自分のハイスコア:609450)(9人ミスの全クリ)
(他人のハイスコア:636750)(全クリ)

=アーケード:ハード=

 武器が一つしか選べず、無敵アイテムが出てくるはずのところで大量の敵を一つの武装で乗り切らないといけないため、「敵弾を防ぐ盾にもなる白」「敵弾を回避しつつ攻撃しやすい青」「広範囲を攻撃できる水色」あたりが有効かと思う。他には「リーチが短いままなのがネックだが攻撃も回収もしやすい黄緑」や「距離の短さが気になるが攻撃判定が持続する赤」あたりも考えられる。

 ただ、自分もまだ3-1までしか行けてないので、正直どれがベストなのかよくわからない。

(自分のハイスコア:190150)(青で3-1まで)
(他人のハイスコア:240950)(水で3-1まで)

=まとめ=

 という感じで自分のハイスコアと自分なりのTipsをまとめてみた。まだ改善の余地があるので、すれ違ったメンツを見つつまたあれこれ試していこうと思う。

すれちがい広場の新ゲーム×4の雑感

=前置き=

 しばらくアプリ系を上げられそうにないのと、休養代わりに何か作業したかったので、とりあえず何か書いてみることにした。

 というわけで、今回はいまさらだけどすれちがい広場に追加された4つのゲームについての感想。

=すれちがいシューティング=

 普通によくできたシューティングゲーム。すれ違ったメンツが武器になるのでそれを回収しつつ、移動方向が変わるステージや拠点防衛のステージなどバリエーションに富んだステージを攻略していく。すれ違った人とのランキング競争ができるので、ハイスコア争いも楽しめる。

 ただ、基本的にはすれ違ったメンツが10人居ないとクリアが難しいしハイスコアも狙えないので、「1日にたくさんすれ違う人」や「コインが余って仕方ない人」向けのゲーム。

すれちがいガ〜デン

 花を育てたり交配したりするゲーム。どうぶつの森の花の交配をさらに複雑にした感じなので、そこらへんが好きな人なら楽しめると思う。ただ、どうぶつの森と同じくらい長期的なスパンで楽しむタイプで、自分がやりたいことを実現するためにはわりと時間がかかる。ので、まだちゃんとした評価をするには早い感じ。

=すれちがい合戦=

 すれ違うたびに増加する兵士をグー・チョキ・パーに割り当て、「負けた側は兵士が半分として扱われる」というルールのもと3回のうち2勝を狙って勝ち進むゲーム。

 だいぶシンプルなうえに運の要素が強いように見えるが、「相手は基本的に"勝ち"を含む手しか選ばない」など相手の思考パターンが見えてくるとこちらが弱くてもわりと勝てるようになったりする。

 全体的な雰囲気・テンポ・難易度はすれちがい伝説に近いので、同じくらいの手軽さを求めている人にはちょうど良いかと思う。

=すれちがい迷宮=

 「フロア構築時のパズル的な楽しさ」と「武器を成長させる楽しさ」と「戦闘時に攻撃や防御のリソースとタイミングをリアルタイムで考える楽しさ」を合わせ持ったゲーム。

 全体的にあれこれ考えることができて楽しいのだが、それ故にかかる時間がかなり変動するのが難点。高難度のパズルボックスを真面目に解こうとすると追加で数十分かかることもある。

=まとめ=

 4つともそれなりにオススメなのだが、実際に毎回4つを真面目にやるとすれ違うたびに30分〜1時間くらい時間を持っていかれることになる。なので、かけられるお金や時間に応じて1〜2個だけ選ぶのも普通にアリだと思う。

 おおまかに言うと以下のような感じ。

  • コインが有り余ってる人
    • 「すれちがいシューティング」がオススメ
      • 他はコインを使ってもただのランダム補充だが、このゲームではクリアやハイスコア狙いで必要になる
  • すれ違う人が少ない(固定気味)という人
    • 「すれちがい迷宮」と「すれちがい合戦」がオススメ
      • すれちがい迷宮は人が少ないと進みづらいが、偏っていると良いアイテムを出しやすい
      • すれちがい合戦はすれちがい人数に応じて相手の戦力なども調整されるらしい(が、相手が強すぎる例もあり)
  • 手軽に楽しみたい人
  • がっつり楽しみたい人
    • 「すれちがいシューティング」と「すれちがい迷宮」がオススメ
      • すれちがいシューティングは普通によくできたシューティング
      • すれちがい迷宮はパズル+RPGでじっくり考えるタイプ


 そういうわけで、ちゃんと方向性の違うゲームが揃っているなーという印象。半年〜1年後くらいにまた追加してもらえると楽しいかなーと思うが、今回のようにいきなり4つも来るとわりと時間を持っていかれるので、1〜2個くらいずつ来るのが良いなーと思っているところ。

=予定=

 スマホ用格ゲーのためにスマホでアタリをとるツールは作ったので、しばらく動作確認してから来週あたりにUPする予定。

 その後はもうしばらく体調の回復の方を優先することにしたので、ゲームをUPするのはかなりあとになりそう。さすがに年末までには何か上げられると思うが。

 それまでブログ上で何もしないのはなんなので、散発的に何かは書いてみる予定。

Googleの検索ブロックをGoogle製Chromeプラグインで代替

=前置き=

 Google検索のブロックがきかなくなって何ヶ月か経ち、さすがに不便に感じてきたので調べてみたら、正式に機能が廃止された代わりにGoogle製のChromeプラグインで代替できることがわかったのでそのメモ。

=代替手順=

 Chromeプラグインで実現するので、ブラウザはChromeを使う。

 まずはプラグインGoogle製)をインポート。
Personal Blocklist (by Google) - Chrome Web Store

 次に、今までブロックしたデータを以下のサイトの「テキストファイルとしてダウンロード」からダウンロード。

 ダウンロードしたテキストの中身をコピー。

 プラグインのアイコンをクリックし、「インポート」をクリックして入力欄にペーストしてインポートボタンを押せば完了。

=予定=

 どうにも体調がいまいちなのでしばらくは昼休みとかは普通に休むことにした。夏季休暇前にゲームが上げられるかは微妙になってきた。とりあえず体調回復の方を優先する予定。

すれちがい迷宮のパズルボックスを解くFlashをUP

=更新=

 箱のサイズを10x10から12x12に変更。

=前置き=

 昨日予定を書いたばかりでなんだけど、モチベの方向が「すれちがい迷宮のパズルが解けねームキー」という方向に向いてしまったので、昨日の夜〜今日にかけて「すれちがい迷宮のパズルボックスを解くFlash」を作ってた。ので、ついでだからUP。

Flash

 少しサイズが大きいので別窓で。
PuzzleResolver.swf 直


 左上で箱の形を設定し、下のそれぞれでブロックの形を設定。あとは計算開始のボタンを押せば右上に結果が出るはず。難しいやつだと少し時間がかかるが数分くらいで済むはず。

 2時間半くらいで作ったので、ところどころ適当な部分があるけど、普通に使うぶんにはいけるかなー。

=予定=

 昨日も書いたけど、基本的にはスマホ用のミニゲーム開発を優先。ただ、今回のようにモチベの方向によってはまた脱線すると思う。

GAEからjavascript経由でFlashに値を渡す方法

=前置き=

 無念番付関連の話題の最後。GAEで一番多い色の計算まではできたので、あとはそれをFlashで実際に使えるように値を渡すまでの処理。

=概要=

 おおまかな流れは以下の通り。

  • テンプレートを使い、値をjavascriptの変数としてセットする
  • Flashはswfobjectで読み込むようにし、その引数に先の値をセットする

=GAE→javascript

 GAEからテンプレートを使ってjavascriptに値を渡すのは、以前のAmazonリンク画像の埋め込みのついでに処理可能。


 スクリプト側は以下のような感じで、「color」に色を設定して渡す。(ちなみにここでは以前のGAEの画像格納に合わせ、img_urlの参照先も変更している)

div_ad_list = []

infos = db.GqlQuery("SELECT * FROM UpdateModel ORDER BY list_index LIMIT 5")
for info in infos:
	div_ad = {}

	#url
	div_ad['link_url'] = info.link_url
	div_ad['img_url'] = 'image?key_name=' + info.key().name()	#info.img_url

	#color
	div_ad['color'] = info.color

	#add
	div_ad_list.append(div_ad)

#template param
template_values = {
	'div_ad_list': div_ad_list,
}

#template apply
path = os.path.join(os.path.dirname(__file__), 'template', 'template.html')
self.response.out.write(template.render(path, template_values))


 今回はcolorのリストになるので、javascriptも以下のように配列として宣言し、そこにテンプレートで値を並べる。

//それぞれの広告で一番多い色のリスト
var color_list = [
	{% for div_ad in div_ad_list %}
		"{{div_ad.color}}",
	{% endfor %}
];

javascriptFlash

 何やら最近はFlashの設定は直接embedするのではなくjavascriptから起動することが多いようで、javascriptからFlashに値を渡すサンプルもそういうものが多かった。ので、今回はswfobjectを使ってFlashに引数を渡して起動することにした。


 まずはGitHub - swfobject/swfobject: An open source Javascript framework for detecting the Adobe Flash Player plugin and embedding Flash (swf) files.からソースコードをダウンロード。実際に使うのはswfobject.jsなのでこれだけコピペすれば十分だが、自動でFlashのバージョンUPを促してくれるexpressInstall.swfもあると便利なようなのでこれもコピペする。(HTMLから参照しやすい位置に)


 そしてjavascriptで以下のようにして埋め込む。

<!-- swfobjectの読み込み -->
<script src="swfobject.js"></script>

<!-- 本体Script -->
<SCRIPT type="text/javascript">
<!--
//それぞれの広告で一番多い色のリスト
//(上で書いたやつ)
var color_list = [
	{% for div_ad in div_ad_list %}
		"{{div_ad.color}}",
	{% endfor %}
];

//Flashから呼び出す関数の設定
var canvasToFlash = window.canvasToFlash= {};
canvasToFlash.getDataURL = function(){
	var index = 0;//実際には色々と計算する
	return color_list[index];
};

//パラメータは関数の設定以外は適当に
var flashvars = {
	getDataURL:'canvasToFlash.getDataURL'
};
var params = {
	menu: 'false',
	scale: 'noScale',
	allowFullscreen: 'true',
	allowScriptAccess: 'always',
	bgcolor: '#000000',
	wmode: 'direct'
};

//swfobjectでswf読み込み
swfobject.embedSWF(
	"GameMain.swf",//このFlashを
	"div_flash",//このdivに読み込む
	"320",//あとはサイズとか色々設定
	"480",
	"10.0.0",
	"expressInstall.swf",
	flashvars,
	params
);
-->


<!-- divだけ設定しておき、あとからswfobjectでFlashをロードする -->
<div id="div_flash" width="320" height="480"></div>

 これで「id="div_flash"」のところにGameMain.swfが埋め込まれる。

 そしてFlashからは以下のようにgetDataURLを呼べばcolorが返ってくる。(ちなみに関数名がgetDataURLなのは元々Amazonなどの画像を渡す目的だったためなので、本来は目的に合わせてちゃんと設定すべき)

var getDataURL:String = loaderInfo.parameters.getDataURL;
var color:uint = ExternalInterface.call(getDataURL);

=参考URL=

GAEで画像のピクセル操作をする方法

=前置き=

 無念番付関連の話題は、先のエントリで「GAEに画像データを格納する」ところまではできた。あとはGAE側で色計算まで行なっておけばページやゲームを開くたびに毎回色を計算するようなムダな処理をしなくて済む。

 というわけで、ここでは「GAEで画像のピクセル操作をする方法」をまとめる。

=概要=

 基本的な流れは以下の通り。

  • PyPngのインストール
  • PILのインストール
  • 画像処理

=PyPngのインストール=

 ピクセル単位での画像の処理はGAEではサポートされていないので、別ライブラリとしてここではPyPngを使うことにする。

 以下から一式をダウンロード。
 Google Code Archive - Long-term storage for Google Code Project Hosting.

 Pythonのお作法的にはちゃんとしたインストール手順があるんだろうけど、ここではcodeフォルダに入っていた「png.py」をGAEに上げるRoot部分にコピーした。

=PILのインストール=

 Amazonから返ってくる画像はjpgであり、さっきのPyPngで扱えるpngではない。というわけで、jpgをpngに変換する必要があるのだが、これはGAEでの画像処理(PIL)で実現できる。

 ただし、PILは本番環境のサーバでは動いているが、ローカルではデフォルトでは入っていない。つまり、自前でインストールする必要がある。
 これはhttps://developers.google.com/appengine/docs/python/images/installingPIL?hl=jaからインストールすればOK。あくまでローカルでの動作確認に必要なだけなので、上げる部分でどうこうする必要はない。

 ちなみにPILをインストールしないと「THREADSAFEがない」とかのエラーが出て変換ができない。

=画像処理=

 準備が完了したらようやく実際の画像処理を行う。(GAEのLauncherを起動中にインストールしたら再起動しておくこと)

 まず、コードはだいたい以下のような感じになる。(URLから画像を得てピクセル列を取得するところまで)

IMG_W = 63
IMG_H = 100

imgURL = "..."

result = urlfetch.Fetch(imgURL)
if result.status_code == 200:
	img_png = images.Image(result.content)	#バイナリ→Image化
	img_png.resize(IMG_W, IMG_H)			#png化ついでに事前にリサイズ
	png_data = img_png.execute_transforms() #jpg => png
	pr = png.Reader(bytes=png_data)			#Readerの設定
	x,y,pixels,meta = pr.asRGB8()			#実際に読み込む

 まずは「jpg→png」の操作を行う準備として、Image化している。

 「jpg→png」の変換にexecute_transformsを使う場合、それ以前にresizeなどの何かしらの操作をしないといけないので、ここではついでにresizeをして実際の表示サイズに変換している。ここらへんはもっと良い方法があるかもしれない。

 そしてその結果をバイト列としてpng.Readerに渡し、それを実際に読み込んでピクセル列(pixels)を得る。


 で、実際にピクセル列を操作するコードは以下のような感じ。

for ps in pixels:	#たぶん横列
	#iter
	rgb_iter = 0
	for p in ps:	#たぶん縦列
		#init
		if rgb_iter == 0:
			#RGB
			r = 0
			g = 0
			b = 0
		#RGB
		if rgb_iter == 0:
			r = p
		if rgb_iter == 1:
			g = p
		if rgb_iter == 2:
			b = p
		#iter
		rgb_iter += 1

		#Pixel
		if 3 <= rgb_iter:
			#rgbが求まったのでなんやかんやする

			#...
			#(1ピクセル分の処理)
			#...

			#iter
			rgb_iter = 0


 pixelsが縦横の2重配列になっているのは良いんだけど、RGBまでバラバラになっているため、1ピクセル分の処理を行う場合は上のようにやや汚い感じのコードになってしまう。ここはもうちょっと別な感じが良かったが、ともあれこれでピクセル操作はできた。