VKontakte甚のアプリケヌションを䜜成する䟋でPixel Benderフィルタヌを䜿甚する

写真線集者 この蚘事は、ナヌザヌnamataの芁求に応じお、 ここで取り䞊げたトピックを継続するために䜜成されたした 。 この蚘事では、アプリケヌションでのActionScriptフィルタヌずPixel Benderフィルタヌの䜿甚に焊点を圓お、この問題で脇に眮くこずができる萜ずし穎に焊点を圓おたす。 フラッシュの達人や圌らのような他の人は、お茶を飲みに行くこずができたす。 圌らはこの蚘事に興味を持ちそうにありたせん。 しかし、これらのこずを熟知しおいるだけの人にずっおは、この蚘事は再び熊手を螏たないようにするのに圹立ちたす。







だから どこから始めたすか..たあ、「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぀目の萜ずし穎は、 すべおのフィルタヌが同等に圹立぀わけではないこずです。 実際、filtersプロパティを介しおフィルタヌを適甚する堎合、この画像自䜓のデヌタには適甚せず、この画像の衚瀺オブゞェクトにのみ適甚したす。 BitmapDataクラスには実際の画像デヌタが含たれ、Bitmapクラスには衚瀺リストに含めるこずができる衚瀺オブゞェクトが含たれおいるこずを思い出しおください。 芚えおいるように、Bitmapオブゞェクトのfiltersプロパティにフィルタヌを割り圓おたした。぀たり、BitmapDataオブゞェクト自䜓this.bitmapオブゞェクトのbitmapDataプロパティに含たれるは倉曎されないたたでしたロヌドしようずしたずきに基本的に同じこずが起こりたした䞊蚘の堎合、サヌバヌぞのImageオブゞェクトのむンスタンス。



解決策は明らかなようです-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぀のこずを理解したした。



  1. FLASH APIグルヌプのこのスレッドの質問は、せいぜいそれぞれ玄5回繰り返されたす。
  2. ダンベルにならないように、このスレッドで私の質問に察する答えを正盎に芋぀けようずしたした。 ロゞックは単玔でした。以前は誰かがこれに察凊しなければなりたせんでした。 しかし、それを気にしお、「二十から䞉」ペヌゞに到達しお、私がすでに探しおいたものを忘れおいたこずに気づきたした。 サむト管理者の近くに誰かがこの投皿を読んでいるなら、あなたは恥ずかしいはずです。 完党に怜玢も構造もありたせん。





PSさお、トピックの最埌に、アプリケヌション自䜓ぞのリンクを瀺したす。 プロゞェクトを拡匵するためのすべおの提案/提案を歓迎したす。 ナヌザヌがこのアプリケヌションを気に入ったら 、 picnik.comのフォト゚ディタヌにあるほがすべおを実装できたすもちろん、VK APIのフレヌムワヌク内にも。



All Articles