2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AnimateCCで生成したファイルの画像をbase64化する方法

Posted at

概要

ゲームの広告だがそのゲームの一部を疑似体験できる、プレイアブルアドという代物を実装することになった。
アプリ上のwebviewで表示されるので、ターゲットブラウザはsafariとchrome。
通常のhtml,css,jsでイケるのだが、複雑なことになると工数かかりそうだなーと思っていたがAdobe AnimateCCという持て余しまくっているツールのことを思い出したので、それで作ってみた。快適快適。
が、とある広告プラットフォームの入稿のフォーマットは単一htmlのみ。
画像のパスをbase64にすれば良いだけの話がいたくハマったので、解決策をここに記す。

間違い

animteCCから書き出されたjsにこんな記載があります。

lib.properties = {
  	id: 'CBE7D0B014C34055B50EB7B1A2F1A211',
  	width: 640,
  	height: 1136,
  	fps: 24,
  	color: "#FFFFFF",
  	opacity: 1.00,
  	manifest: [
  		{src:"images/test_atlas_.png?1551178733007", id:"test_atlas_"}
  	],
  	preloads: []
  };

これだけ見ると、srcの中身をbase64化したものに変えるだけで良いと思うが、全然動きません。
理由は、裏でPreloadJSが動いているから。
animateCCは基本的にCreateJSにおんぶにだっこなので、マニフェスト内の画像はPreloadJSによって事前ロードされます。
なので、base64をhtml内のimgタグに書き、jsでそいつを読み込んであげてanimate内の画像管理部分に紐づけてあげる、までを自前でやる必要があります。

htmlに追記する

html内にimgタグでbase64を書いちゃいましょう。

<img id="test_atlas_" style="display:none" width="2048" height="2048" title="" alt="" src="data:image/png;base64,iVBORw0K...">

canvasの下あたりにimgタグを追加します。display:noneにしておくことを忘れず。
idは、上で紹介したmanifestのidと同じ名前にしましょう。

jsを改造する

animateでエクスポートしたjsに変数を追記

最後のほうで、グローバル変数を定義している部分があるので、createjs, AdobeAn,に続き、「images」を追加します。

})(createjs = createjs||{}, AdobeAn = AdobeAn||{});
var createjs, AdobeAn, images;

htmlのインラインjsでpreloadの記載を修正

init()の上からすぐに見つかると思うので、この5行をコメントアウトします。

// var loader = new createjs.LoadQueue(false);
// loader.addEventListener("fileload", function(evt){handleFileLoad(evt,comp)});
// loader.addEventListener("complete", function(evt){handleComplete(evt,comp)});
// var lib=comp.getLibrary();
// loader.loadManifest(lib.properties.manifest);

そして、下記を追加します。
images変数を初期化し、htmlにべた書きしたbase64の画像と、manifestのidを紐づけています。

images = images||{};
var manifest = lib.properties.manifest;
for (var i=0, l=manifest.length; i<l; i++) {
  	var id = manifest[i].id;
  	var img = document.getElementById(id);
  	if (img != null) {
  		images[id] = img;
  	}
}
handleComplete(comp);

もうちょい修正

loaderの記述のすぐ下のほうに、handleCompleteという関数があります。
修正前はloaderのcompleteイベントも一緒に渡していたのですが、loader使わないので引数を修正します。

//function handleComplete(evt, comp) {
function handleComplete(comp) {

さらにすぐ下のほう、この一文もいらないのでコメントアウト。

// var queue = evt.target;

最後です。さらにすぐ下のほう。for文でloaderから画像の本体を引っ張ってくる部分を、loaderではなく自前で用意したimagesに置き換えてあげます。

for(i=0; i<ssMetadata.length; i++) {
  	// ss[ssMetadata[i].name] = new createjs.SpriteSheet( {"images": [queue.getResult(ssMetadata[i].name)], "frames": ssMetadata[i].frames} )
    ss[ssMetadata[i].name] = new createjs.SpriteSheet( {"images": [images[ssMetadata[i].name]], "frames": ssMetadata[i].frames} )
}

終わり

これで画像をソース内に入れ込むことができました!
cdnから読んでるcreateJSもインラインに含めてしまえば、立派な入稿用単一htmlが完成しました!
プレイアブルアドの実装を考えている方の参考になれば幸いです。ニッチすぎる!!!!
現場からは以上です。

参考(これしかなかった)
https://www.reddit.com/r/createjs/comments/4dfldb/how_do_i_use_base24_instead_of_external_library/

2
5
1

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
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?