小编Joc*_*oel的帖子

使用 Node.js(和 NPM 包 'psd')解析 Adob​​e PSD 文件,以编程方式替换图像层,然后保存/渲染为 PNG

对于一个项目,我需要解析一个 Adobe Photoshop PSD 文件,以编程方式查找并替换图像层,然后将其保存回 PSD 文件和/或将其导出为 PNG(或 JPEG)。我对 Adob​​e Photoshop 没有太多经验,但我认为这些类型的图层被称为“智能图层”。

用例:

渲染样机预览图像

  • 用户上传图片到 Node HTTP 服务器
  • 用上传的图片替换PSD中的图层(图片填充图层)
  • 呈现为 PNG/JPEG 并写入 HTTP 响应

对于模型模板,替换层在 x 和 y 上倾斜 3d。我附上了一张图片来说明这意味着什么。未来将创建其他模型模板,这就是为什么我认为用常量值标记替换层是实现这一点的方法。

模板文件: 模板文件

上传的图片: 上传的图片

最终渲染的图像 输出图像

我不需要 HTTP 服务器/身份验证等方面的帮助,这部分很简单。我只是在寻找一种替换图像层的方法。

PSD 文件是/将是为此特定项目定制的。根据图层名称(标签)确定要替换的正确图层是一种可接受的实现方式。

我查看了几个 NPM 包来完成这项工作,但无法获得功能原型。这个包似乎是最有前途的。

https://www.npmjs.com/package/psd

我目前有以下代码:

/* mockup.js */
var PSD = require('psd')
var psd = PSD.fromFile("mockup.psd")
var fs = require('fs')

psd.parse()

/* For easier reference */
var replacementLayer, file, fileBuffer

let tree = psd.tree()

let layers = tree.layer.node._children

for(let …
Run Code Online (Sandbox Code Playgroud)

png psd render node.js

9
推荐指数
1
解决办法
2140
查看次数

在 Node.js 上使用 Proxy.apply() 不起作用。这是一个错误还是我做错了?

我正在使用代理来代理一个对象。getter 和 setter 可以正常工作。但是,从不调用 apply 方法。

    var p = new Proxy({}, {
    /* getter */
    get(target, name) {
        return target[name]
    },
    /* setter */
    set(target, name, value) {
        target[name] = value
    }, 
    /* supposedly called apply */
    apply(target,that,arg) {
        console.log('apply is called, what to do here?')        
    }
})
Run Code Online (Sandbox Code Playgroud)

这样,p即使它不存在,我也可以分配或返回一些东西。例如,当我让 getter 函数返回这个时

get(target, name) {
    return 'getting ' + name
},
Run Code Online (Sandbox Code Playgroud)

然后即使它不存在,console.log(p.flappy)我也会得到“变得飘逸”的响应。

到目前为止一切顺利,但是当我尝试调用flappy 时,p.flapppy()它会抛出一个错误,即flappy 不是函数。

这仍然有些明显,因为 getter 不返回函数。当我让 getter 返回这样的函数时

get(target, name) { …
Run Code Online (Sandbox Code Playgroud)

javascript proxy call apply node.js

7
推荐指数
2
解决办法
1274
查看次数

ECMAScript7 async/await不一致的行为取决于是否在箭头函数中使用括号

我在使用现代ES6 + async/await时在Google Chrome 60.0.3112.78(官方构建版)(64位)中遇到不一致的行为,具体取决于我是否在箭头函数中使用括号返回Promise.Node.js也是如此.我无法理解为什么.

我知道这不是如何实现sleep()函数,但它是最简单的演示方式.请考虑以下示例代码段.

function sleep(ms = 0) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

(async () => {
  console.log('a');
  await sleep(5000);
  console.log('b');
})()
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,这将写一个控制台,等待5秒然后写b到控制台.


使用箭头函数返回Promise的较短表示法.

const sleep = ms => { return new Promise(resolve => setTimeout(resolve, ms)) }

(async () => {
  console.log('a');
  await sleep(5000);
  console.log('b');
})()
Run Code Online (Sandbox Code Playgroud)

正如所料,此代码的行为相同.ab写入控制台,间隔为5000毫秒.


以下代码不起作用.唯一的区别是我没有将Promise的返回包装在第一行的括号中.

const sleep = ms => …
Run Code Online (Sandbox Code Playgroud)

javascript async-await

2
推荐指数
1
解决办法
464
查看次数

标签 统计

javascript ×2

node.js ×2

apply ×1

async-await ×1

call ×1

png ×1

proxy ×1

psd ×1

render ×1