ã ããïŒ ã©ãããå§ããŸããïŒ..ãŸãããVKontakteã®çç±ããšãã質åããå§ããã®ãããããè¯ãã§ãããã çãã¯ç°¡åã§ãïŒç§ã¯åœŒãã®APIãç解ãããã£ãã§ã:)å®éãããã¯éèŠã§ã¯ãããŸããã ãµãŒãããŒãã£ã®ãµãŒããŒã§ãã¹ããããŠããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ³ã¯ããµã€ãã§ãã¹ããããŠããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ³ãšã¯å€å°ç°ãªãã ãã§ãã ãããããŸãæåã«ã
ãã®èšäºã§ã¯ããã£ã«ã¿ãŒèªäœã®äœæã®åé¡ã«ã€ããŠã¯è§ŠããŸããã ããªãã¯ãã§ã«ããããæã£ãŠãããšä»®å®ããŸãã ãããå°ãªããšã1ã€ã¯...ãŸã ããã§ãªãå Žåã¯ã ããã«ããã€ãã®äŸããããŸãã æ¡åŒµåã.pbjã®ãã£ã«ã¿ãŒãã¡ã€ã«ãæ¢ã«æå ã«ããå Žåã¯ã©ãããŸããïŒ
Pixel Benderãã£ã«ã¿ãŒãFlash / Flexã¢ããªã±ãŒã·ã§ã³ã«æ¥ç¶ããã«ã¯ãå°ãªããšã2ã€ã®æ¹æ³ããããŸãã æåã®æ¹æ³ã§ã¯ãã¡ã¿ã¿ã°ã䜿çšããŠãã£ã«ã¿ãŒãåã蟌ã¿ãŸãã
[Embed(source="SomeFilter.pbj", mimeType="application/octet-stream")]
private var _someFilter:Class;
ãã®å Žåãããã次ã®ã·ããªãªã§ããã«ãã£ã«ã¿ãŒã䜿çšãããŸãã
var shader:Shader = new Shader(new _someFilter() as ByteArray);
var shaderFilter:ShaderFilter = new ShaderFilter(shader);
var bitmap:Bitmap = new Bitmap(someBitmapData);
bitmap.filters = [shaderFilter];
filtersããããã£ã¯ãã£ã«ã¿ãŒã®é åã§ãã ãã ããé åã®æåŸã«æ°ãããã£ã«ã¿ãŒãè¿œå ããã ãã§ã¯ïŒããšãã°ãããã·ã¥ïŒ[...]ïŒã¡ãœããã䜿çšããå ŽåïŒããã®ãã£ã«ã¿ãŒã䜿çšããå¿ èŠã¯ãããŸããã æåã«ãã£ã«ã¿ãŒãé åã«è¿œå ããŠããããã®é åãfiltersããããã£ã«åå²ãåœãŠããå¿ èŠããããŸãã
2çªç®ã®æ¹æ³ã§ã¯ãå®è¡æã«ãã£ã«ã¿ãŒãããŒãããŸãã
var urlLoader:URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener(Event.COMPLETE, onLoadComplete);
urlLoader.load(new URLRequest("SomeShader.pbj"));
var shader:Shader;
function onLoadComplete(event:Event):void {
shader = new Shader();
shader.byteCode = loader.data;
var shaderFilter:ShaderFilter = new ShaderFilter(shader);
var bitmap:Bitmap = new Bitmap(someBitmapData);
bitmap.filters = [shaderFilter];
}
äžè¬ã«ããã£ã«ã¿ãŒãããŒãïŒãŸãã¯åã蟌ã¿ïŒããåŸã¯ããã£ã«ã¿ãŒãäœã§ãããã¯é¢ä¿ãããŸãããPixelBenderãŸãã¯åºæ¬èšèªãã£ã«ã¿ãŒã§èšè¿°ãããŠããŸãã ãããã®ãããªã䜿çšæ³ã¯ã»ãŒåæ§ã§ãã
ã§ã¯ãç³ã¯ã©ãã§ããïŒ
次ã«ãã¢ããªã±ãŒã·ã§ã³ã§ãããã®ãã£ã«ã¿ãŒã䜿çšããæ©èœã«ã€ããŠèª¬æããŸãã
åæ¥äŒæ© ïŒ
ç§ãéçºããã¢ããªã±ãŒã·ã§ã³ã¯ãç»åã®æãããã³ã³ãã©ã¹ãã圩床ãæ床ãªã©ã®ç¹æ§ãå€æŽã§ããå°ããªãã©ããšãã£ã¿ãŒã§ãã ãã¹ãŠã®ç»åãã£ã³ãã«ã®å€ãšåãã£ã³ãã«ãåå¥ã«å€æŽã§ããŸãã ãã£ã«ã¿ã®ãããå€ãèšå®ããããšãã§ããŸãã
ã¢ã«ãã ã®éžæïŒ
åçã®ç·šéïŒ
æåã«è©±ããèœãšãç©Žã¯ãAPIã䜿çšããŠç»åïŒãã®å Žåã¯ãŠãŒã¶ãŒã®åçïŒãååŸã§ããããšã§ãã ããããç»åããŒã¿ã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸãã:)ç§ã¯äœã«ã€ããŠè©±ããŠããã®ã§ããïŒ ããã«äœããããŸãïŒ
èå³ã®ããåçãžã®ãã¹ãå«ãæååããµãŒããŒã«è©°ã蟌ãã ç¹å®ã®å€æ°ããããšä»®å®ããŸãïŒãµãŒããŒãžã®ãªã¯ãšã¹ãã®çµæãšããŠãã®ãã¹ãååŸããŸããïŒã 次ã«ãFlexãã¬ãŒã ã¯ãŒã¯ã®Imageã¯ã©ã¹ã䜿çšããŠã次ã®ããã«èšè¿°ããŸãã
[Bindable]
private var _photoSrc:String = "path/to/image";
<mx:Image id="curPhoto" source="{this._photoSrc}" />
ããã«ãã³ãŒãå ã®ã©ããïŒç§ã®å Žåãããã¯ã¹ã©ã€ããŒã¹ã©ã€ããŒããã©ãã°ããã€ãã³ããã³ãã©ãŒã§çºçããŸããïŒã次ã®ããã«èšè¿°ããŸãã
curPhoto.filters = [shaderFilter];
ãã£ã«ã¿ãŒãé©çšãããŠããããã§ã->ç»é¢äžã®ç»åã¯å°ãç°ãªã£ãŠããŸã->æºè¶³ããŠããŸã-> VKontakteãµãŒããŒã«ã¢ããããŒãã§ããŸãã
ããããã¡ãã£ãšåŸ ã£ãŠãã ããã ãã®å Žåãå ã®ç»åãšãŸã£ããåãç»åããµãŒããŒã«éä¿¡ãããŸãã ãã£ã«ã¿ãŒããã蟌ãŸããŠããŸãããïŒ ãŸã£ãããããŸããã
å¥ã®ã·ããªãªãæ€èšããŠãã ããã
Loaderã¯ã©ã¹ã䜿çšããŠç»åãããŒããããšããŸãã ãã®æ¹æ³ã䜿çšããã«ã¯ã2ã€ã®éèŠãªãã€ã³ãããããŸãã
1. Loaderã¯ã©ã¹ã®ãªããžã§ã¯ãã®loadïŒïŒã¡ãœããã«ã¯ãéåžžã次ã®ã·ã°ããã£ãå¿ èŠã§ãã
loader.load(new URLRequest(this._photoSrc), new LoaderContext(true));
ã¡ãœããã®2çªç®ã®åŒæ°ã¯ãæåã®åŒæ°ãtrueã«ãªãLoaderContextã¯ã©ã¹ã®ãªããžã§ã¯ãã§ãªããã°ãªããŸããã ãã®çµæãFlash Playerã¯ç»åãã¡ã€ã«èªäœã®ããŠã³ããŒããéå§ããåã«ã»ãã¥ãªãã£ããªã·ãŒãã¡ã€ã«ãããŠã³ããŒãããããšããŸãïŒãŠãŒã¹ã±ãŒã¹Security.allowDomainïŒ "*"ïŒããã®å Žåã¯ãã£ãŒãããŸããïŒã
2.ã€ãã³ããã³ãã©ãŒEvent.COMPLETEã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
var bitmapData:BitmapData = new BitmapData((event.currentTarget as LoaderInfo).content.width, (event.currentTarget as LoaderInfo).content.height);
bitmapData.draw(this.loader);
this.bitmap = new Bitmap(bitmapData);
this.curPhoto.source = this.bitmap;
this.bitmap.filters = [shaderFilter];
éèŠãªããšã¯ãthis.loader.contentãdrawïŒïŒã¡ãœããã«æž¡ãã®ã§ã¯ãªããthis.loaderãªããžã§ã¯ãèªäœãæž¡ãããšã§ãã ãªããããªã®ããããã¯ãã°ãªã®ãæ©èœãªã®ãïŒ æ£çŽããããŸããã§ããã ããããããã¯æ©èœããä»ã®ãã¹ãŠã®ãªãã·ã§ã³ã¯ãµã³ãããã¯ã¹ã®ã»ãã¥ãªãã£ããªã·ãŒã«éåããŸãã
ãããã£ãŠããããããããªããžã§ã¯ãã¯ãã±ããã«ããã衚瀺ãªã¹ãã«è¿œå ãããã£ã«ã¿ãŒãé©çšããŠããµãŒããŒã«ã¢ããããŒãã§ããŸãã ç©èªã¯çµããã§ããïŒ ããã§ããªãã
2ã€ç®ã®èœãšãç©Žã¯ã
解決çã¯æãããªããã§ã-applyFilterïŒ[...]ïŒã¡ãœãããããã€ãã®äžéBitmapDataãªããžã§ã¯ãã«é©çšããå¿ èŠããããŸãïŒãã®å Žåãã¡ãœããã®æåã®åŒæ°ã¯this.bitmap.bitmapDataããããã£ã®BitmapDataãªããžã§ã¯ãã«ãªããŸãïŒã ããããç§ã®å Žåãããã€ãã®ããããã£ãå€æŽããããã®ãµããŒããå®è£ ããããšãåŸç¶ã®åãã£ã«ã¿ãŒã®ã¢ããªã±ãŒã·ã§ã³ã¯åã®ãã£ã«ã¿ãŒã®ãã¹ãŠã®å€æŽãäžæžãããŸãã ã€ãŸã æäœåŸã¯ãæåŸã®ãã£ã«ã¿ãŒã®é©çšã«ããå€æŽã®ã¿ã衚瀺ãããŸããã æ®å¿µãªããããã®ã¡ãœããã§1ã€ã®ãã£ã«ã¿ãŒã§ã¯ãªãããã£ã«ã¿ãŒã®é åã䜿çšããããšã¯ã§ããŸããã
ã©ãããïŒ
解決çã¯ããçããããšãå€æããŸããã Imageã¯ã©ã¹ãªããžã§ã¯ããèŠããŠããŸããïŒ ããã§åœŒã¯éå®ããŸããã ãµã³ãã«ã³ãŒãã次ã«ç€ºããŸãã
var bitmapdata:BitmapData = new BitmapData((curPhoto.content as Bitmap).width, (curPhoto.content as Bitmap).height);
bitmapdata.draw(curPhoto.content as Bitmap);
var jpgEncoder:JPGEncoder = new JPGEncoder(85);
this.jpgStream = jpgEncoder.encode(bitmapdata);
// ...
ã€ãŸã BitmapDataã¯ã©ã¹ã®äžéãªããžã§ã¯ããäœæãããã®äžã«Imageãªããžã§ã¯ãã®ã³ã³ãã³ããã¬ã³ããªã³ã°ããŸããã æãåºããŠãã ãããã以åã«ãããããããã¯ã©ã¹ã®this.bitmapã®ã€ã³ã¹ã¿ã³ã¹ïŒãã£ã«ã¿ãŒãé©çšãããã®ïŒãã¯ã©ã¹Imageã®ãªããžã§ã¯ãã®ãœãŒã¹ããããã£ã«å²ãåœãŠãŸããã ããã¯ãå®éã«ã¯ããã£ã«ã¿ãŒèªäœãé©çšããŠç»åèªäœã®ããŒã¿ãæäœããã®ã§ã¯ãªãããã®è¡šç€ºãªããžã§ã¯ãã®ã¿ãæäœããããšãæå³ããŸãã
åæ¥äŒæ© ïŒ
ã¢ããªã±ãŒã·ã§ã³ã«ãã£ã«ã¿ãŒãé©çšããçµæã瀺ãããã«ããã£ã«ã¿ãŒãé©çšããååŸã®ã¹ã¯ãªãŒã³ã·ã§ãããããã€ã瀺ããŸãã
ç·šéåã®åçïŒ
...以éïŒ
ãããã¯ã«é¢ããããã€ãã®èãïŒ
1.ååãšããŠãçŸåšã¢ããªã±ãŒã·ã§ã³ã«ãããã©ã¡ãŒã¿ãŒãç·šéããã«ã¯ãActionScriptèšèªã®ç³ã¿èŸŒã¿ãã£ã«ã¿ãŒïŒConvolutionFilterïŒã䜿çšããããšãã§ããŸãã ç§ãç¥ãéããããã§ååã§ãããã ããããç§ã¯Pixel Bender'omãããŸãåŠçãããã£ãã ãã§ã:)ïŒã Pixel Benderã¯ãè€éãªãã£ã«ã¿ãŒã®äœæã«é©ããŠããŸãã ç»åïŒããæ£ç¢ºã«ã¯ããã¯ã»ã«ïŒã䜿çšããæ¹ãç°¡åã§ç解ããããã§ãã ç³ã¿èŸŒã¿ãã£ã«ã¿ãŒã䜿çšããå Žåãè¡åãæäœããå¿ èŠããããŸãã äžè¬çã«ãããã¯èª°ã«ãšã£ãŠãå人çãªåé¡ã§ãã
2. Pixel Benderãã£ã«ã¿ãŒã¯ãå®è¡æã«ããŒãããããããããžã§ã¯ãã«åã蟌ãæ¹ãé©åã§ãã ãããã¯ååã«è»œéã§ãïŒç§ã®ãã£ã«ã¿ãŒã¯ã©ãã1ãããã€ã以äžã®éãã¯ãããŸããã§ããïŒã äœåãªã³ãŒãã¯åœ¹ã«ç«ã¡ãŸããã
3. VK APIã¯äžè¬çã«åªããŠããŸãã 管çè ã«ããæ€èšŒã®å°ãé¢åãªæ®µéã FLASH APIã°ã«ãŒãã®ããã£ã¹ã«ãã·ã§ã³ãã»ã¯ã·ã§ã³ã®ãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®äœæã«é¢ãã質åãã§ä»ã®éçºè ã®è³ªåãšåçãèªãã§ãã¢ããªã±ãŒã·ã§ã³ãæ¿èªãããããã«ã¯ããã¹ãŠã®èŠä»¶ãæºããã ãã§ãªããé©åãªãã§ãŒãºãããããšãå¿ èŠã§ããããšã«æ°ä»ããŸããæïŒãããŠææã®ãã¬ãŒãã¯ãã£ã³ããŒã³ãå·ã€ããªãã ãã...ïŒã ãããããç³è«ãåããŠæ¿èªãããã®ã¯å¹žéã ã£ãã§ãããã ã¡ãªã¿ã«ããã®ã¢ããªã±ãŒã·ã§ã³ã¯1é±éã§ãŒãããäœæãããã»ãŒ1é±éãã§ãã¯ãããŸãã...ããå°ãé¢çœãã£ãã§ãããã
4.éçºè ããã®ãã£ãŒãããã¯ã«ãŸã£ããæºè¶³ããŠããŸããã ã¯ããFLASH APIã°ã«ãŒãããããŸããã¢ããªã±ãŒã·ã§ã³ã®äœæã«ã€ããŠè³ªåã§ãããããã¯ããããŸãã ãããïŒ ç§ãç解ããŠããããã«ã質åã¯ååãšããŠãµã€ãã®ç®¡çã«é¢ä¿ã®ãªã人ã ïŒã€ãŸããã»ãšãã©ã®å Žåããã§ã«è¡çªããä»ã®éçºè ïŒã«ãã£ãŠåçãããŸãã ãã®ä»ã 1ã€ã®è³ªåã«å¯Ÿããçããæ¢ããŠãããšãã2ã€ã®ããšãç解ããŸããã
- FLASH APIã°ã«ãŒãã®ãã®ã¹ã¬ããã®è³ªåã¯ãããããããããçŽ5åç¹°ãè¿ãããŸãã
- ãã³ãã«ã«ãªããªãããã«ããã®ã¹ã¬ããã§ç§ã®è³ªåã«å¯Ÿããçããæ£çŽã«èŠã€ããããšããŸããã ããžãã¯ã¯åçŽã§ããã以åã¯èª°ããããã«å¯ŸåŠããªããã°ãªããŸããã§ããã ãããããããæ°ã«ããŠããäºåããäžãããŒãžã«å°éããŠãç§ããã§ã«æ¢ããŠãããã®ãå¿ããŠããããšã«æ°ã¥ããŸããã ãµã€ã管çè
ã®è¿ãã«èª°ãããã®æçš¿ãèªãã§ãããªããããªãã¯æ¥ããããã¯ãã§ãã å®å
šã«æ€çŽ¢ãæ§é ããããŸããã
PSïŒããŠããããã¯ã®æåŸã«ãã¢ããªã±ãŒã·ã§ã³èªäœãžã®ãªã³ã¯ã瀺ããŸãã ãããžã§ã¯ããæ¡åŒµããããã®ãã¹ãŠã®ææ¡/ææ¡ãæè¿ããŸãã ãŠãŒã¶ãŒããã®ã¢ããªã±ãŒã·ã§ã³ãæ°ã«å ¥ã£ãã ã picnik.comã®ãã©ããšãã£ã¿ãŒã«ããã»ãŒãã¹ãŠãå®è£ ã§ããŸãïŒãã¡ãããVK APIã®ãã¬ãŒã ã¯ãŒã¯å ã«ãïŒã