1

Ich habe Breite und Höhe des Bildes.PIL: fügen Sie einen Text in der unteren Mitte des Bildes

Ich versuche eine allgemeine Möglichkeit zu finden, einen Text zum Bild in der unteren Mitte hinzuzufügen.

Hier ist die Funktion, die ich geschrieben habe:

def process_img(img_src, title, background): 

    img = Image.open(img_src, 'r') 
    draw = ImageDraw.Draw(img) 
    w, h = img.size 

    font = ImageFont.truetype("MuseoSansCyrl_0.otf", 100) 
    text_w, text_h = draw.textsize(title, font) 

    draw.text((REQ_WIDTH, REQ_HEIGHT), title, (255,255,255), font=font) 

    img.save(img_src) 

    return img_src 

Gibt es eine Möglichkeit, die REQ_WIDTH und REQ_HEIGHT bekommen kann?

Antwort

1

Sie bereits einen Anruf zu draw.textsize gestellt hatte, mit dem Sie die Breite und Höhe der endgültige Text wird wieder - von diesem Punkt, thave Sie nur die linke obere Ecke zu berechnen, wo Sie Ihren Text so machen:

Ihr sein text_height, links image_width/2 wird - - text_width/2 -

Top Ihre image_height sein so wird Ihr Rendering Anruf einfach:

draw.text(((w - text_2) // 2, h - text_h), title, (255,255,255), font=font) 

(Beachten Sie, dass draw.text eine optionale "Anker" Argument enthält - aber Die möglichen Werte dafür sind nicht dokumentiert, und die Dokumentation gibt nicht an, ob dies der Fall ist tatsächlich implementiert. Wenn es implementiert ist, und es ist ein Wert, der (horizontal_center, unten) als Anker darstellt, sollten Sie nur die image_width/2 und image_height passieren müssen, ohne dass draw.textsize nennen)

+0

es wie ein Zauber funktioniert !! Vielen Dank :) – Abhi

+0

Wenn mein Titel länger ist als das Bild selbst wird es nicht versauen? Kann ich einen Text so verpacken, dass er gut aussieht? zum Beispiel: ** Game Of Thrones Die Schlacht der Bastarde ** – Abhi

2

Die Namen, die Sie haben für die benötigten Variablen - REQ_WIDTH und REQ_HEIGHT - sind ein wenig irreführend, weil sie keine Breite und Höhe sind.

Sie brauchen nur ein wenig Mathematik zu tun:

X_POS = h - text_h 
    Y_POS = w//2 - text_w//2 # or (w - text_w) // 2 

    draw.text((X_POS, Y_POS), title, (255,255,255), font=font) 
+0

Wenn mein Titel länger ist als das Bild selbst wird es nicht versauen? Kann ich einen Text so verpacken, dass er gut aussieht? für Beispiel: ** Game Of Thrones Der Kampf von Bastard ** – Abhi

+0

Wenn die berechnete x-Position ist die Zeichenfolge negativ ist dann zu lang passen. Sie könnten die 'font' Größe reduzieren, bis es funktioniert, oder vielleicht das [' textwrap'] (https://docs.python.org/2/library/textwrap.html#module-textwrap) Modul verwenden, um es zu umbrechen - obwohl letzterer davon ausgeht, dass alle Zeichen die gleiche Breite haben, etwas, was nur für [monospaced fonts] (https://en.wikipedia.org/wiki/Samples_of_monospaced_typefaces) gilt (aber nicht für Museo Sans). – martineau

+0

Ich kann einen Textumbruch machen, aber ich wollte, dass die Textzeilen nicht mehr als 2 überschreiten. – Abhi