-
[Adobe开发] 注册表: 通过python获取软件安装路径
使用python内置模块访问注册表: winreg Adobe各种软件都在 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Adobe 里, 具体你可以windows搜索注册表编辑器打开并访问具体位置, 查看更多信息 以PS为例 import winreg ps_registry_path = "SOFTWARE\\Adobe\\Photoshop" ps_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, ps_registry_path) num_subkeys = winreg.QueryInfoKey(ps_key)[0] versions = [] for i in range(num_subkeys): subkey_name = winreg.EnumKey(ps_key, i) versions.append(subkey_name) # 选择最新版本的 Photoshop latest_version = max(versions) ps_key_latest_version = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, ps_registry_path + "\\" + latest_version) # 获取最新版本 Photoshop 的安装路径(也可以指定) PS_APP = winreg.QueryValueEx(ps_key_latest_version, "ApplicationPath")[0] + "Photoshop.exe" print("最新版本的 Photoshop 安装路径:", PS_APP)- 139
- 0
-
[PS开发]如何使用命令行运行PS的jsx脚本
只需要找到ps的exe文件, 并在后面追加脚本路径即可 "E:\adobe\Adobe Photoshop 2022\Photoshop.exe" "c:\temp\ps_temp_com.jsx" 如何忽略警告 创建PSUserConfig.txt文件, 放在C:\Users\{用户名}\AppData\Roaming\Adobe\Adobe Photoshop {版本号}\Adobe Photoshop {版本号} Settings\ 其中里的内容要改成你自己的 文件内容为: WarnRunningScripts 0- 132
- 0
-
[PS开发]使用python脚本操作Photoshop
github: https://github.com/loonghao/photoshop-python-api/tree/main 示例 安装python模块 pip install photoshop_python_api 运行py文件, 以下内容会创建新文字图层,设置文字与颜色,并保存在D盘 import photoshop.api as ps app = ps.Application() doc = app.documents.add() new_doc = doc.artLayers.add() text_color = ps.SolidColor() text_color.rgb.red = 0 text_color.rgb.green = 255 text_color.rgb.blue = 0 new_text_layer = new_doc new_text_layer.kind = ps.LayerKind.TextLayer new_text_layer.textItem.contents = 'Hello, World!' new_text_layer.textItem.position = [160, 167] new_text_layer.textItem.size = 40 new_text_layer.textItem.color = text_color options = ps.JPEGSaveOptions(quality=5) # # save to jpg jpg = 'd:/hello_world.jpg' doc.saveAs(jpg, options, asCopy=True) app.doJavaScript(f'alert("save to jpg: {jpg}")') 平台 windows 原理 Photoshop在Win32(Windows) 平台上可用的 COM 对象列表,你可以使用与获取相关对象方法, 用来操作ps 测试 import win32com.client # 创建一个 COM 对象,表示 Photoshop 应用程序 app = win32com.client.Dispatch("Photoshop.ActionDescriptor") # 获取 Photoshop 应用程序的所有属性和方法 com_object_list = dir(app) # 打印 COM 对象列表 print("COM Objects in Photoshop:") for obj in com_object_list: print(obj) 获取本机可用的Dom 使用powershell运行以下脚本 Get-ChildItem HKLM:\Software\Classes -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -match '^\w+\.\w+$' -and (Test-Path -Path "$($_.PSPath)\CLSID") } | Select-Object -ExpandProperty PSChildName- 115
- 0
-
[PS开发]获取当前选择图层
https://gist.github.com/hilukasz/03b17ee78414aadff995 function getSelectedLayers(doc: Document) { const cTID = function (s: any) { return app.charIDToTypeID(s); }; const sTID = function (s: any) { return app.stringIDToTypeID(s); }; var selLayers = []; var desc = new ActionDescriptor(); var ref = new ActionReference(); ref.putClass(sTID("layerSection")); desc.putReference(cTID("null"), ref); var lref = new ActionReference(); lref.putEnumerated(cTID("Lyr "), cTID("Ordn"), cTID("Trgt")); desc.putReference(cTID("From"), lref); executeAction(cTID("Mk "), desc, DialogModes.NO); var group = doc.activeLayer; var layers = group.layers; for (var i = 0; i < layers.length; i++) { selLayers.push(layers[i]); } executeAction(cTID("undo", undefined, DialogModes.NO)); return selLayers; } var selectedLayers = getSelectedLayers(app.activeDocument); for (var i = 0; i < selectedLayers.length; i++) { // ... }- 52
- 0
-
chatGPT报错: Not available OpenAI's services are not available in your country
注册时如果选择了香港TZ或者没有TZ, 会报错 此时请F12打开开发者控制台,或者右键->检查 切换到console(控制台) 输入以下代码,并按回车 返回, 重新登录即可 window.localStorage.removeItem(Object.keys(window.localStorage).find(i=>i.startsWith('@@auth0spajs')))- 2.2k
- 0
-
Obsidian自动化套用模板与存放笔记
大家好我是铅笔小明。在使用了一段时间obsidian以后,我也有了一些自己特别的功能需求,可是和大多数人一样,我并不是程序员,对代码没有那么了解,所以遵循着拿来主义,一直在各种别人的开箱即用库里抽取不同的功能为我所用。今天想分享的这个功能是来自油管主播Pamela Wang的ob库,这个功能可以让你在笔记中新建双链并点击后自动跳出选择套用的模板还可以进一步选择要把笔记移动的文件夹。 比较直观的功能入下方gif所示: 目前这个功能只需要一个插件:Templater 进行前先确保已经安装了Templater插件。 我觉得也不需要一步步带着大家做,我会把代码和库都分享出来,方便大家下载直接修改使用。这里我只要去分析代码部分的修改代表的意义就可以方便大家去DIY对于自己独有的功能。 首先在选项里的文件与链接中指定一个新建笔记的存放位置,我这里就设置为“00 - 临时”这样我新建一个笔记,笔记就会自动移动到这个文件夹。 然后把getTitleSnippet.js复制到库内的文件夹。我这里是复制到templater下的script里。 然后向下继续设置,把script文件夹设置到对应的文件夹。这样可以读取到我们复制过来的js脚本功能。 我们先建立一个模板文件我命名为“01 自动选择模板”,这个可以随意命名,只要后面和templater里设置的对应上就行。 这个模板里写入对应的tp语法。(会在最后分享) 最上面的代码是调取我们之前复制的getTitleSnippet.js这个功能。这个脚本的功能是获取文件名中“-”前的文字来贡下方的判断做选择。这个自动选择模板的功能是直接在写笔记的时候在“-”前写入关键词来让ob帮你判断这个笔记套用哪个模板,这样就不需要自己选择,可以设立多个关键词来对应同一个模板,比如我这里就设置了“人物”和“人”两个关键词,这样当我输入[[人物-张山]]或者[[人-李四]]。然后点击双链创建新笔记的话就会自动套用对应的人物模板。 再建立一个手动选择模板。 如图所示。 手动选择模板的功能是为了当没有在笔记中写入“-”和特定的关键词时新建笔记会自动弹出一些模板供你选择出你希望这个笔记用到的模板。方便快速调用。 最后建一个模板算一个补充功能,可以帮助你把模板分类。比如在手动选择模板的时候你想只出现三个大领域的选项“工作”“生活”“其他”然后在每一个领域点进去以后再有对应的一些模板选项。 我这里建的是“选择学习相关模板”这个模板在自动选择模板中也出现过,也就是说如果我输入[[学习-学点东西]]然后点击双链建立新的笔记,那么它就会弹出几个学习模板选项供我选择。这样可能对模板多的人不会显得很杂乱。 接下来看一下tp的模板里需要如何设置和一些设置的具体功能 大部分设置我是喜欢放在yaml区,这样预览模式的时候看不到。 先看一下需要选择路径的模板设置。这种模板适用于主文件夹里还有一些子文件夹,会涉及到路径的选择语法。最上面的部分是调用js脚本来改笔记的名字,去掉“-”和之前的内容。下面部分就是路径选择的脚本功能。 第二个类型就是不需要选择路径,只需要放到特定的文件夹就行。这里就取消了选择语句,只要填入路径即可。 在Templater设置中。先打开Enable Folder Templates,这个功能是自动让加入到某个文件夹中的笔记套用对应的模板。现在这个设置就是让所有新建的模板先过一遍自动选择模板。 设置结束以后,就可以正常使用这个功能了。我会放出这个功能的事例库,和用到的代码与脚本。大家可以自行选择下载。 功能库下载链接: getTitleSnippet.js 功能库 链接: https://pan.baidu.com/s/1NTe_m8SI1sZHASyAD-xtPw?pwd=1c84 提取码: 1c84- 1.7k
- 0
-
-
【AI脚本】批量单独保存AI图层为ai文件 | 熊猫 | 免费
function exportFileToAI(dest) { if (app.documents.length > 0) { var ai8Doc = new File(dest); var saveOptions = new IllustratorSaveOptions(); saveOptions.compatibility = Compatibility.ILLUSTRATOR8; saveOptions.flattenOutput = OutputFlattening.PRESERVEAPPEARANCE; app.activeDocument.saveAs(ai8Doc, saveOptions); } } var doc = app.activeDocument; var folder = doc.path+"/"+doc.name+"-分层"; Folder(folder).create() var mainFile = File(doc.fullName) for(var i=doc.layers.length-1; i>=0; i--) { for(var ii=doc.layers.length-1; ii>=0; ii--){ if(i!==ii){ doc.layers[ii].remove(); }else{ doc.layers[ii].visible = true; } } exportFileToAI( folder+"/"+doc.layers[0].name+".ai"); doc.close(); doc = app.open(mainFile); }- 356
- 0
-
【PR脚本】示例:移动后面剪辑到前面的末尾
本来想用clip.start。表面上可以读写,但是会报错!! 所以要用try,这样会生效,再忽视错误即可 以下脚本为:移动视频第2轨的 第2个剪辑片段 对齐到 第1个剪辑片段的后面 // Move Next Clip To Previous End var sequence = app.project.activeSequence; // active sequence var clip1 = sequence.videoTracks[1].clips[0] // first clip var clip2 = sequence.videoTracks[1].clips[1] // second clip var new_end_time = clip2.end.seconds - clip2.start.seconds + clip1.end.seconds // second clip new end time , this way, dont change the clip duration // use "clip.start" or "clip.end" will throw an error. I dont know why. try { clip2.start = clip1.end.seconds } catch (error) { try { clip2.end = new_end_time } catch (error) { } }- 316
- 0
-
【PR脚本】添加到AME渲染
来源 NT油管教程 知识点 1.文件路径要用/或者\ 2.渲染参数中的文件要用字符串 3.可以先判断文件是否存在,file.exists 4.AME的预设文件在C:\Users\你的用户名\Documents\Adobe\Adobe Media Encoder\14.0\Presets\ 里 源码 var sequence = app.project.activeSequence; // 活动序列 app.encoder.launchEncoder(); // 启动AME // var video = File("C:\\Users\\YL\\Desktop\\test.mp4") // var preset = File("C:\\Users\\YL\\Documents\\Adobe\\Adobe Media Encoder\\14.0\\Presets\\IG.epr") // 添加文件到渲染队列 // app.encoder.encodeFile(video.fsNmae, preset.fsNmae, 0, true); // 添加系列到渲染队列 app.encoder.encodeSequence(sequence, "C:\\Users\\YL\\Desktop\\test.mp4", "C:\\Users\\YL\\Documents\\Adobe\\Adobe Media Encoder\\14.0\\Presets\\MY Preset.epr", 0, true); app.encoder.startBatch(); // 开始渲染- 363
- 0
-
【PR脚本】遍历动态图形的属性
截图 getMGTComponent 文档里好像没有,后面记得加 代码 var sequence = app.project.activeSequence; // 获取当前序列 var videoTrack = sequence.videoTracks[0]; // 第一个视频轨道 var clip = videoTrack.clips[0]; // 第一个片段 var mogrtComponent = clip.getMGTComponent(); for (var i = 0; i < mogrtComponent.properties.numItems; i++) { alert(mogrtComponent.properties[i].displayName) }- 169
- 0
-
【AI脚本】将选中的元素转换为图层
与AI自带的释放到图层功能类似,但可只转换选中元素,并且转换后会把图层命名变为元素名。 // if( !app.activeDocument ){alert("先打开一个文件!"); return false} var selItems = app.activeDocument.selection; if(selItems.length < 1){alert("至少选择一个元素!"); return false} for(var i = selItems.length-1; i>=0; i--) { var newLayer = app.activeDocument.layers.add(); newLayer.name = selItems[i].name; selItems[i].move(newLayer,ElementPlacement.PLACEATBEGINNING); }- 305
- 0
-
【PS脚本】设置图层标记颜色
function setLayerColor(color) { var refer = new ActionReference(); refer.putEnumerated(charIDToTypeID(Lyr ), charIDToTypeID(Ordn), charIDToTypeID(Trgt)); var desc = new ActionDescriptor(); desc.putEnumerated(charIDToTypeID(Clr ), charIDToTypeID(Clr ), stringIDToTypeID(color)); var desc2 = new ActionDescriptor(); desc2.putObject(charIDToTypeID(T ), charIDToTypeID(Lyr ), desc); desc2.putReference(charIDToTypeID(null), refer); executeAction(charIDToTypeID(setd), desc2, DialogModes.NO); } setLayerColor('green')- 219
- 0
❯
Profile
Check-in
Search
Customer service
Scan to open current page
Top
Checking in, please wait...
Click for today's check-in bonus!
You have earned {{mission.data.mission.credit}} points today
My Coupons
-
¥CouponsLimitation of use:Expired and UnavailableLimitation of use:
before
Limitation of use:Permanently validCoupon ID:×Available for the following products: Available for the following products categories: Unrestricted use:Available for all products and product types
No coupons available!
Unverify
Daily tasks completed