HynemanKan 2018-11-10 09:10 采纳率: 0%
浏览 2048

python3.x PIL模块 ImageDraw 什么都没画出来

初学PIL,遇到了一些问题,为什么ImageDraw什么都没画出来

from PIL import Image, ImageDraw, ImageFont


class BackGround:#根对象
    def __init__(self, draw,im):
        self.l_x = 0
        self.l_y = 0
        self.im = draw
        self.s_x, self.s_y = im.size

    def get_postion(self):
        return self.l_x, self.l_y

    def get_size(self):
        return self.s_x, self.s_y


class DrawElement:#父类
    def __init__(self, parent, l_x, l_y):
        self.im = parent.im
        self.parent = parent
        self.l_y = l_y
        self.l_x = l_x

    def get_postion(self):
        l_x = self.l_x + self.parent.get_postion()[0]
        l_y = self.l_y + self.parent.get_postion()[1]
        return l_x, l_y

    def draw(self):
        pass

    def get_size(self):
        pass


class Text(DrawElement):#单行文字

    def __init__(self, parent, l_x, l_y, text, myfont):
        self.im = parent.im
        self.text = text
        self.parent = parent
        self.l_y = l_y
        self.l_x = l_x
        self.front = myfont

    def get_size(self):
        size_x, size_y = self.im.textsize(self.text, self.front)
        return size_x, size_y

    def draw(self):
        self.im.text(self.get_postion(), self.text, font=self.front, fill=(255, 0, 0))


class MultipleText(DrawElement):#多行文字
    def __init__(self, parent, l_x, l_y, text, myfont, lineSpacing):
        self.parent = parent
        self.im = parent.im
        self.l_x = l_x
        self.l_y = l_y
        self.texts = text.split("\n")
        self.font = myfont
        self.lineSpacing = lineSpacing
        self.childrens = []
        l_t_x = 0
        l_t_y = 0
        s_t_x = 0
        for i in range(len(self.texts)):
            tl = Text(self, l_t_x, l_t_y, self.texts[i], self.font)
            s_x, s_y = tl.get_size()
            if s_x > s_t_x:
                s_t_x = s_x
            l_t_y += (s_y + self.lineSpacing)
            self.childrens.append(tl)
        for item in self.childrens:
            item.l_x = int((s_t_x - item.get_size()[1]) / 2)
        self.s_x = s_t_x
        self.s_y = l_t_x - self.lineSpacing

    def get_size(self):
        return self.s_x, self.s_y

    def draw(self):
        for item in self.childrens:
            item.draw()


class Rectangle(DrawElement):
    def __init__(self, parent, l_x, l_y, s_x, s_y):
        self.parent = parent
        self.im = parent.im
        self.l_x = l_x
        self.l_y = l_y
        self.s_x = s_x
        self.s_y = s_y

    def get_size(self):
        return self.s_x, self.s_y

    def draw(self):
        self.im.rectangle((self.get_postion(), (self.l_x, self.l_y)))


class TextBox(DrawElement):
    def __init__(self, parent, l_x, l_y, text, frameWidth, myfont,lineSpacing):
        self.im = parent.im
        self.parent = parent
        self.font = myfont
        self.l_x = l_x
        self.l_y = l_y
        self.text = text
        self.frameWidth = frameWidth
        self.mtext = MultipleText(self, frameWidth, frameWidth, text, self.font,lineSpacing)
        x, y = self.mtext.get_size()
        self.s_x = x + self.frameWidth * 2
        self.s_y = y + self.frameWidth * 2
        self.rect = Rectangle(self, 0, 0, self.s_x, self.s_y)

    def draw(self):
        self.mtext.draw()
        self.rect.draw()

    def get_size(self):
        return self.s_x, self.s_y

    def get_connect_point(self, side):
        l_g_x, l_g_y = self.get_postion()
        s_x, s_y = self.get_size()
        if side == "LEFT":
            return l_g_x, l_g_x + s_y / 2
        elif side == "RIGHT":
            return l_g_x + s_x, l_g_y + s_y / 2
        elif side == "TOP":
            return l_g_x + s_x / 2, l_g_y
        else:
            raise Exception("wrong parameter, can only accept 'LEFT','RIGHT'")


class Line(DrawElement):
    def __init__(self, parent, a_point, b_point):
        self.parent = parent
        self.im = parent.im
        if a_point[0] < b_point[0]:
            self.l_x = a_point[0]
        else:
            self.l_x = b_point[0]
        if a_point[1] < b_point[1]:
            self.l_y = a_point[1]
        else:
            self.l_y = b_point[1]
        self.s_x = abs(a_point[0] - b_point[0])
        self.s_y = abs(a_point[1] - b_point[1])
        self.lines = [[[(a_point[0] + b_point[0]) / 2, a_point[1]], a_point]
                      [[(a_point[0] + b_point[0]) / 2, a_point[1]], [(a_point[0] + b_point[0]) / 2, b_point[1]]],
                      [[(a_point[0] + b_point[0]) / 2, b_point[1]], b_point]]

    def draw(self):
        for line in self.lines:
            self.im.line(line)


myfont = ImageFont.truetype("temp.ttf",20)
newim = Image.new("RGB", (1280, 1280), "#00ffff")
draw = ImageDraw.ImageDraw(newim)
bg = BackGround(draw, newim)
t = Text(bg, 10, 10, "test", myfont)
newim.show()
newim.save("out.png")

  • 写回答

1条回答 默认 最新

  • devmiao 2018-11-10 15:42
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器