ai-tube-clap-exporter / src /core /ffmpeg /createTextOverlayImage.mts
jbilcke-hf's picture
jbilcke-hf HF staff
improve text overlay generation
deff001
raw
history blame
1.95 kB
import { TextOverlayFont, TextOverlayFontWeight, TextOverlayPosition, TextOverlayStyle, getCssStyle } from "../utils/getCssStyle.mts"
import { htmlToBase64Png } from "../converters/htmlToBase64Png.mts"
// generate a PNG overlay using HTML
// most sizes are in percentage of the image height
export async function createTextOverlayImage({
text = "",
textStyle = "outline",
fontFamily = "Montserrat",
// the unit is vh (so `fontSize: 4` = 4% of the window height)
fontSize = 3,
fontWeight = 600,
horizontalPosition = "center",
verticalPosition = "end",
rotation = 0,
px = 10,
py = 10,
width = 1024,
height = 576
}: {
text?: string
// pre-defined text styling, can be: outline or highlight
textStyle?: TextOverlayStyle
fontFamily?: TextOverlayFont
// font size, in % of the video height
fontSize?: number
// font weight, can be one of: 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900
fontWeight?: TextOverlayFontWeight
// start, center or end
horizontalPosition?: TextOverlayPosition
// start, center or end
verticalPosition?: TextOverlayPosition
rotation?: number
// horizontal padding - yes the unit is in vh, *not* vw (so `px: 8` = 8% of the window height)
px?: number
// vertical padding - the unit is in vh (so `py: 8` = 8% of the window height)
py?: number
width?: number
height?: number
}): Promise<{
filePath: string
buffer: Buffer
}> {
const html = `<html>
<head>${getCssStyle({
fontFamily,
fontSize,
fontWeight: 600,
horizontalPosition,
verticalPosition,
px,
py,
})}</head>
<body>
<!-- main content block (will be center in the middle of the screen) -->
<div class="content">
<!-- main line of text -->
<p class="${textStyle}">
${text}
</p>
</div>
</body>
</html>`
const result = await htmlToBase64Png({
html,
width,
height,
})
return result;
};