Python Tkinter 和 Pillow - 添加时文本会发生偏移
Python Tkinter and Pillow - Text gets offset when added
所以我有这个文本加法器,它应该找到矩形的中心并在那里添加文本。但我注意到它偏离了它应该是的样子(https://imgur.com/a/5aGcpPw)
我已经尝试检查我的代码,但我仍然无法弄清楚。图像缩小到 4 倍大小以适合屏幕,但之后坐标都乘以 4 以说明这一点。帮忙?
完整代码(失败的部分如下):https://pastebin.com/JzApRJdM
class PictureWindow(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.parent = parent
self.x = self.y = 0
self.rect = None
self.tex = None
self.start_x = None
self.start_y = None
image = Image.open(file)
smaller_image = image.resize((round(image.size[0]/4), round(image.size[1]/4)))
img = ImageTk.PhotoImage(smaller_image)
self.canvas = tk.Canvas(self, width=img.width(), height=img.height())
self.canvas.img = img
self.canvas.create_image(0, 0, image=img, anchor=tk.NW)
self.canvas.pack(expand=True)
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.canvas.bind("<B1-Motion>", self.on_move_press)
self.canvas.bind("<ButtonRelease-1>", self.on_button_release)
self.finished = tk.Button(self, text="Add Watermark", command=self.Watermark)
self.finished.pack()
self.go_back = tk.Button(self, text="Go back to change settings", command=self.go_away)
self.go_back.pack()
def _from_rgb(self, rgb):
r, g, b = rgb
return f'#{r:02x}{g:02x}{b:02x}'
def go_away(self):
self.withdraw()
def on_button_press(self, event):
self.start_x = event.x
self.start_y = event.y
self.canvas.delete(self.tex)
self.tex = None
if not self.rect:
self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, fill=self._from_rgb((249, 0, 0)), stipple='gray12')
def on_move_press(self, event):
self.curX, self.curY = (event.x, event.y)
self.text_x = ((self.start_x + self.curX) / 2)
self.text_y = ((self.start_y + self.curY) / 2)
self.canvas.coords(self.rect, self.start_x, self.start_y, self.curX, self.curY)
def on_button_release(self, event):
font_preview_size = int(font_size)
font_preview_almost = (font_preview_size/4)
font_preview = int(font_preview_almost)
if not self.tex:
self.tex = self.canvas.create_text((self.text_x, self.text_y), text=watermark_text, font=('Gotham Medium', font_preview), fill=self._from_rgb((color)))
def Watermark(self):
self.font_size_var = font_size
Font_Size = int(self.font_size_var)
A = int(alpha)
R = int(color[0])
B = int(color[1])
G = int(color[2])
img = Image.open(file).convert("RGBA")
img.x, img.y = img.size
txt = Image.new("RGBA", img.size, (225,225,225,0))
if custom_font == "yes":
font = ImageFont.truetype(font_file, Font_Size)
draw = ImageDraw.Draw(txt)
text = watermark_text
if custom_font == "no":
font = ImageFont.truetype('arial.ttf', Font_Size)
draw = ImageDraw.Draw(txt)
text = watermark_text
print(f'Start X and Y: {self.start_x}, {self.start_y}')
print(f'Current X and Y: {self.curX}, {self.curY}')
print(f'Canvas: {self.canvas.winfo_screenwidth()}, {self.canvas.winfo_screenheight()}')
self.coords = ((self.start_x + self.curX) / 2)*4, ((self.start_y + self.curY) / 2)*4
print(f'Final Coords: {self.coords}')
draw.text((self.coords), text, font=font, fill=(R, G, B, A))
comp = Image.alpha_composite(img, txt)
comp.save(save_file)
comp.show()
app = Selection(root)
app.mainloop()
我认为是因为字体大小保持不变。
愚蠢的是,我不知道有助于解决此问题的锚点功能。我只需要使用 anchor 并将其设置为 mm
所以我有这个文本加法器,它应该找到矩形的中心并在那里添加文本。但我注意到它偏离了它应该是的样子(https://imgur.com/a/5aGcpPw)
我已经尝试检查我的代码,但我仍然无法弄清楚。图像缩小到 4 倍大小以适合屏幕,但之后坐标都乘以 4 以说明这一点。帮忙?
完整代码(失败的部分如下):https://pastebin.com/JzApRJdM
class PictureWindow(tk.Toplevel):
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.parent = parent
self.x = self.y = 0
self.rect = None
self.tex = None
self.start_x = None
self.start_y = None
image = Image.open(file)
smaller_image = image.resize((round(image.size[0]/4), round(image.size[1]/4)))
img = ImageTk.PhotoImage(smaller_image)
self.canvas = tk.Canvas(self, width=img.width(), height=img.height())
self.canvas.img = img
self.canvas.create_image(0, 0, image=img, anchor=tk.NW)
self.canvas.pack(expand=True)
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.canvas.bind("<B1-Motion>", self.on_move_press)
self.canvas.bind("<ButtonRelease-1>", self.on_button_release)
self.finished = tk.Button(self, text="Add Watermark", command=self.Watermark)
self.finished.pack()
self.go_back = tk.Button(self, text="Go back to change settings", command=self.go_away)
self.go_back.pack()
def _from_rgb(self, rgb):
r, g, b = rgb
return f'#{r:02x}{g:02x}{b:02x}'
def go_away(self):
self.withdraw()
def on_button_press(self, event):
self.start_x = event.x
self.start_y = event.y
self.canvas.delete(self.tex)
self.tex = None
if not self.rect:
self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, fill=self._from_rgb((249, 0, 0)), stipple='gray12')
def on_move_press(self, event):
self.curX, self.curY = (event.x, event.y)
self.text_x = ((self.start_x + self.curX) / 2)
self.text_y = ((self.start_y + self.curY) / 2)
self.canvas.coords(self.rect, self.start_x, self.start_y, self.curX, self.curY)
def on_button_release(self, event):
font_preview_size = int(font_size)
font_preview_almost = (font_preview_size/4)
font_preview = int(font_preview_almost)
if not self.tex:
self.tex = self.canvas.create_text((self.text_x, self.text_y), text=watermark_text, font=('Gotham Medium', font_preview), fill=self._from_rgb((color)))
def Watermark(self):
self.font_size_var = font_size
Font_Size = int(self.font_size_var)
A = int(alpha)
R = int(color[0])
B = int(color[1])
G = int(color[2])
img = Image.open(file).convert("RGBA")
img.x, img.y = img.size
txt = Image.new("RGBA", img.size, (225,225,225,0))
if custom_font == "yes":
font = ImageFont.truetype(font_file, Font_Size)
draw = ImageDraw.Draw(txt)
text = watermark_text
if custom_font == "no":
font = ImageFont.truetype('arial.ttf', Font_Size)
draw = ImageDraw.Draw(txt)
text = watermark_text
print(f'Start X and Y: {self.start_x}, {self.start_y}')
print(f'Current X and Y: {self.curX}, {self.curY}')
print(f'Canvas: {self.canvas.winfo_screenwidth()}, {self.canvas.winfo_screenheight()}')
self.coords = ((self.start_x + self.curX) / 2)*4, ((self.start_y + self.curY) / 2)*4
print(f'Final Coords: {self.coords}')
draw.text((self.coords), text, font=font, fill=(R, G, B, A))
comp = Image.alpha_composite(img, txt)
comp.save(save_file)
comp.show()
app = Selection(root)
app.mainloop()
我认为是因为字体大小保持不变。
愚蠢的是,我不知道有助于解决此问题的锚点功能。我只需要使用 anchor 并将其设置为 mm