feat(aklive2d): added a logic to handle images that does not require alpha composite

This commit is contained in:
Haoyu Xu
2023-08-12 12:56:54 +08:00
parent 5979c77c26
commit 88aa63c69e
2 changed files with 19 additions and 4 deletions

View File

@@ -28,4 +28,8 @@ export default class AlphaComposite {
return await sharp(newImage).rotate(rotate).toBuffer()
}
async toBuffer(filename, extractedDir) {
return await sharp(path.join(extractedDir, filename)).toBuffer()
}
}

View File

@@ -1,6 +1,6 @@
/* eslint-disable no-undef */
import path from 'path'
import { read, write, readSync } from './file.js'
import { read, write, readSync, exists, copy } from './file.js'
import AlphaComposite from './alpha_composite.js'
export default class AssetsProcessor {
@@ -19,8 +19,13 @@ export default class AssetsProcessor {
async process(extractedDir) {
const fallback_name = __config.operators[this.#operatorName].fallback_name
const fallbackFilename = `${fallback_name}.png`
const fallbackBuffer = await this.#alphaCompositer.process(fallbackFilename, `${path.parse(fallbackFilename).name}[alpha].png`, extractedDir)
const alphaCompositeFilename = `${path.parse(fallbackFilename).name}[alpha].png`
if (exists(path.join(extractedDir, alphaCompositeFilename))) {
const fallbackBuffer = await this.#alphaCompositer.process(fallbackFilename, alphaCompositeFilename, extractedDir)
await write(fallbackBuffer, path.join(this.#operatorSourceFolder, this.#operatorName, fallbackFilename))
} else {
await copy(path.join(extractedDir, fallbackFilename), path.join(this.#operatorSourceFolder, this.#operatorName, fallbackFilename))
}
// generate portrait
const portraitDir = path.join(this.#shareFolder, "portraits")
@@ -51,7 +56,13 @@ export default class AssetsProcessor {
const dimensions = atlas.match(new RegExp(/^size:(.*),(.*)/gm))[0].replace('size: ', '').split(',')
const matches = atlas.match(new RegExp(/(.*).png/g))
for (const item of matches) {
const buffer = await this.#alphaCompositer.process(item, `${path.parse(item).name}[alpha].png`, extractedDir)
let buffer;
const alphaCompositeFilename = `${path.parse(item).name}[alpha].png`
if (exists(path.join(extractedDir, alphaCompositeFilename))) {
buffer = await this.#alphaCompositer.process(item, alphaCompositeFilename, extractedDir)
} else {
buffer = await this.#alphaCompositer.toBuffer(item, extractedDir)
}
assetsJson[`./assets/${item}`] = BASE64_PNG_PREFIX + buffer.toString('base64')
}
assetsJson[`./assets/${skelFilename.replace('#', '%23')}`] = BASE64_BINARY_PREFIX + skel.toString('base64')