AE插件开发示例
????????如上一篇文章🔗搭建AE插件開(kāi)發(fā)框架?介紹,功能實(shí)現(xiàn)需在鉤子函數(shù)?CommandHook() 中開(kāi)發(fā),那來(lái)看看怎么獲取圖層的曝光值吧!
????????先獲取當(dāng)前圖層:
AEGP_LayerH layerH = NULL; ERR(suites.LayerSuite8()->AEGP_GetActiveLayer(&layerH));????????再根據(jù)圖層獲取對(duì)應(yīng)的效果空間,如曝光度對(duì)應(yīng)的 effect_key 是 825:
AEGP_InstalledEffectKey effect_key = 825; AEGP_EffectRefH effectH; ERR(suites.EffectSuite4()->AEGP_ApplyEffect(S_my_id, layerH, effect_key, &effectH));????????如果僅此,那么插件每執(zhí)行一次,效果控件面板就會(huì)增加一個(gè)曝光度面板:
?????????可以通過(guò)如下代碼在應(yīng)用該效果前做個(gè)判斷:
A_long num_effectsL = 0; Boolean is_apply = false; ERR(suites.EffectSuite4()->AEGP_GetLayerNumEffects(layerH, &num_effectsL)); for (A_long i = 0; i < num_effectsL; ++i) {ERR(suites.EffectSuite4()->AEGP_GetLayerEffectByIndex(S_my_id, layerH, i, &effectH));ERR(suites.EffectSuite4()->AEGP_GetInstalledKeyFromLayerEffect(effectH, ¤t_key));if (current_key == effect_key) {is_apply = true;break;} } if (!is_apply) {ERR(suites.EffectSuite4()->AEGP_ApplyEffect(S_my_id, layerH, effect_key, &effectH)); }????????打開(kāi)曝光度面板后,可以看到有多個(gè)參數(shù),如主要通道下的曝光度、偏移,還有單個(gè)通道包括紅綠藍(lán)的曝光度等等,每個(gè)參數(shù)都有對(duì)應(yīng)的的一個(gè)標(biāo)記以及值,可以通過(guò)方法?AEGP_GetEffectNumParamStreams() 獲取:
ERR(suites.StreamSuite5()->AEGP_GetEffectNumParamStreams(effectH, &num_paramsL)); // 列出 effect 下所有 stream for (A_long i = 1; i < num_paramsL; ++i) {ERR(suites.StreamSuite5()->AEGP_GetNewEffectStreamByIndex(S_my_id, effectH, i, &streamH));ERR(suites.DynamicStreamSuite4()->AEGP_GetMatchName(streamH, stream_name));ERR(suites.StreamSuite5()->AEGP_GetStreamType(streamH, &stream_type));ERR(suites.StreamSuite5()->AEGP_GetStreamProperties(streamH, &flags, &min, &max));s = "stream index:" + std::to_string(i) + ", name:" + stream_name + ", type:" + std::to_string(stream_type) + ", min:" + std::to_string(min) + ", max:" + std::to_string(max);writeLog(s); }????????打印結(jié)果如下:
????????這里打印出的都是些相關(guān)屬性,包括 stream 匹配名稱(chēng)、類(lèi)型、最大值、最小值等,如果要獲取具體曝光值,可以調(diào)用?AEGP_GetNewStreamValue() 方法:
AEGP_LTimeMode time_mode = AEGP_LTimeMode_LayerTime; A_Time timeT = {0, 1}; AEGP_StreamValue2 stream_value; AEFX_CLR_STRUCT(stream_value); ERR(suites.StreamSuite5()->AEGP_GetNewStreamValue(S_my_id, streamH, time_mode, &timeT, TRUE, &stream_value));????????stream_value 就記錄了具體值,注意到它是 AEGP_StreamValue2 類(lèi)型,定義如下:
typedef union {AEGP_FourDVal four_d;AEGP_ThreeDVal three_d;AEGP_TwoDVal two_d;AEGP_OneDVal one_d;AEGP_ColorVal color;AEGP_ArbBlockVal arbH;AEGP_MarkerValP markerP;AEGP_LayerIDVal layer_id;AEGP_MaskIDVal mask_id;AEGP_MaskOutlineValH mask;AEGP_TextDocumentH text_documentH; } AEGP_StreamVal2;typedef struct {AEGP_StreamRefH streamH;AEGP_StreamVal2 val; } AEGP_StreamValue2;????????這時(shí)候前面打印的? stream_type 字段就派上用場(chǎng)了,這是取曝光值的關(guān)鍵??聪?stream_type 一共有哪些:
enum {AEGP_StreamType_NO_DATA,AEGP_StreamType_ThreeD_SPATIAL,AEGP_StreamType_ThreeD,AEGP_StreamType_TwoD_SPATIAL,AEGP_StreamType_TwoD,AEGP_StreamType_OneD,AEGP_StreamType_COLOR,AEGP_StreamType_ARB,AEGP_StreamType_MARKER,AEGP_StreamType_LAYER_ID,AEGP_StreamType_MASK_ID,AEGP_StreamType_MASK,AEGP_StreamType_TEXT_DOCUMENT }; typedef A_long AEGP_StreamType;?????????stream_type 值為 5 的話(huà),也就是?AEGP_StreamType_OneD 類(lèi)型,再根據(jù)?AEGP_StreamVal2 中類(lèi)型定義,通過(guò)?stream_value.val.one_d 就可以取到相應(yīng)值啦!
????????如果要修改曝光值呢?譬如修改主要通道曝光值為 0.6,將其賦值給 stream_value.val.one_d ,再直接調(diào)用方法 AEGP_SetStreamValue() 即可:
stream_index = 3; stream_value.val.one_d = 0.6; ERR(suites.StreamSuite5()->AEGP_GetNewEffectStreamByIndex(S_my_id, effectH, stream_index, &streamH)); ERR(suites.StreamSuite5()->AEGP_SetStreamValue(S_my_id, streamH, &stream_value));????????以上,歡迎交流~
總結(jié)
- 上一篇: JC机制与JVM内存区域
- 下一篇: 11位CEO自述:全世界都怀疑我的时候,