首页 > 解决方案 > Tkinter/Pillow - 如何在与 Pillow 相同的地方制作 (0, 0)

问题描述

所以我试图找出在使用画布坐标向图像添加文本时我的坐标被搞砸了,直到我注意到 (0, 0) 已关闭:在此处输入图像描述

我如何将画布的原点放在与 Pillow 相同的位置(或者至少在添加文本时考虑到这一点)?

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]/2), round(image.size[1]/2)))
                        
    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.create_text((0, 0), text="(0, 0)", fill=self._from_rgb((225, 225, 225)))
    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)
    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 = alpha 
        
    
        
    R = int(color[0])
    B = int(color[1])
    G = int(color[2])

    img = Image.open(file).convert("RGBA")
    img_down = img.resize((int(img.width/2), int(img.height/2)), resample=Image.NEAREST)
    
    img_down.x, img_down.y = img_down.size 
    txt = Image.new('RGBA', img_down.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
    
    
    self.final_x = self.canvas.canvasx(self.text_x)
    self.final_y = self.canvas.canvasx(self.text_x)
    
    
    
    draw.text((self.final_x, self.final_y), text, font=font, fill=(R, G, B, A))
    
    
    
    comp = Image.alpha_composite(img_down, txt)
    
    img_up = comp.resize((int(comp.width*2), int(comp.height*2)), resample=Image.NEAREST)
    
    img_up.save(save_file)
    img_up.show()

ps如果有人知道为什么当枕头文字alpha设置为0时,永远不会添加文字,请告诉我!

标签: pythontkinterpython-imaging-library

解决方案


我将发布 Bryan Oakley 的评论作为答案。Pillow 有一个锚选项,我需要做的就是将它设置为 mm


推荐阅读