Использование Python с Fonttools для водяных знаков в файле шрифтаPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использование Python с Fonttools для водяных знаков в файле шрифта

Сообщение Anonymous »

Я пытаюсь применить X к определенным шрифтам в моем скрипте flask, хотя я могу применить «X» (который является водяным знаком). Я не могу объединить его в том же слое, что и глиф, чтобы его можно было открыть. в любом редакторе и удалил. Как я могу добиться этого программно, возможно ли это вообще с помощью Python и Fonttools?
Вот мой скрипт

Код: Выделить всё

from flask import Flask, request, render_template, send_from_directory
import os
from fontTools.ttLib import TTFont, TTLibError
from fontTools.pens.ttGlyphPen import TTGlyphPen
from werkzeug.utils import secure_filename
import logging
from matplotlib.path import Path
from fontTools.pens.basePen import BasePen

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads/'

logging.basicConfig(level=logging.DEBUG)

class GlyphPlotter(BasePen):
"""Custom pen for converting glyph outlines to matplotlib paths."""
def __init__(self, glyphSet, linewidth=1):
super().__init__(glyphSet)
self.path = []
self.x_points = []
self.y_points = []

def _moveTo(self, p):
self.path.append((Path.MOVETO, p))
self.x_points.append(p[0])
self.y_points.append(p[1])

def _lineTo(self, p):
self.path.append((Path.LINETO, p))
self.x_points.append(p[0])
self.y_points.append(p[1])

def _curveToOne(self, p1, p2, p3):
self.path.append((Path.CURVE4, p1))
self.path.append((Path.CURVE4, p2))
self.path.append((Path.CURVE4, p3))
self.x_points.extend([p1[0], p2[0], p3[0]])
self.y_points.extend([p1[1], p2[1], p3[1]])

def _closePath(self):
self.path.append((Path.CLOSEPOLY, self.path[0][1]))

def add_cross_overlay(glyph, glyph_set, stroke_width):
"""Adds a 'X' sign overlay at the center of the glyph's bounding box with thick lines."""
plotter = GlyphPlotter(glyph_set)
glyph.draw(plotter)

if plotter.x_points and plotter.y_points:
xMin, xMax = min(plotter.x_points), max(plotter.x_points)
yMin, yMax = min(plotter.y_points), max(plotter.y_points)
else:
xMin, yMin, xMax, yMax = 0, 0, 1000, 1000  # Default bounding box

centerX = (xMin + xMax) / 2
centerY = (yMin + yMax) / 2

logging.debug(f"Drawing X on glyph with bounding box ({xMin}, {yMin}, {xMax}, {yMax})")

pen = TTGlyphPen(glyph_set)
glyph.draw(pen)

# Draw a thick X by creating a parallelogram path
pen.moveTo((xMin, yMax))
pen.lineTo((xMax, yMax - stroke_width))
pen.lineTo((xMax - stroke_width, yMin))
pen.lineTo((xMin + stroke_width, yMin))
pen.closePath()

pen.moveTo((xMax, yMax))
pen.lineTo((xMin, yMax - stroke_width))
pen.lineTo((xMin + stroke_width, yMin))
pen.lineTo((xMax - stroke_width, yMin))
pen.closePath()

new_glyph = pen.glyph()
return new_glyph

@app.route('/')
def index():
return render_template('index.html')

@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return 'No file part'
file = request.files['file']
if file.filename == '':
return 'No selected file'
if file:
filename = secure_filename(file.filename)
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
file.save(filepath)
try:
watermark_font(filepath)
except TTLibError as e:
logging.error(f"Error processing font: {e}")
return f"Error processing font: {e}"
return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)

def watermark_font(filepath):
font = TTFont(filepath)
glyph_set = font.getGlyphSet()

for char in ['T', 'h', 'e']:
glyph_name = font.getBestCmap().get(ord(char))
if glyph_name:
glyph = glyph_set[glyph_name]

# Apply a watermark
new_glyph = add_cross_overlay(glyph, glyph_set, stroke_width=30)

# Replace the glyph in the font
font['glyf'][glyph_name] = new_glyph

font.save(filepath)

if __name__ == '__main__':
app.run(debug=True)

Я попытался объединить исходный глиф и водяной знак в один слой, объединив их контуры в один набор контуров в файле шрифта. При этом глиф и водяной знак просто полностью удаляются
п>

Подробнее здесь: https://stackoverflow.com/questions/785 ... -font-file
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как скачать видео из Тик Ток без водяных знаков Android Java
    Гость » » в форуме Android
    0 Ответы
    41 Просмотры
    Последнее сообщение Гость
  • Как скачать видео из Тик Ток без водяных знаков Android Java
    Anonymous » » в форуме JAVA
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • Как скачать видео из Тик Ток без водяных знаков Android Java
    Anonymous » » в форуме Android
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • Как я могу использовать React-native-image-marker с Expo для добавления водяных знаков к изображениям?
    Anonymous » » в форуме CSS
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Как открыть окно во Flink, если больше водяных знаков не получено?
    Anonymous » » в форуме JAVA
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»