直播源码网站,点击图片可进行任意方向旋转功能

直播源码网站,点击图片可进行任意方向旋转功能实现的相关代码

一、使用PIL库

在Python中, 实现turtle的图片旋转需要使用PIL库, 该库可通过pip安装。

使用PIL的Image.open函数可以实现加载图片; 使用ImageTk.PhotoImage可将PIL.Image对象转换为tkinter使用的类型。

PIL与tkinter实现的显示图片的程序如下:

 

1
<br>from tkinter import *<br>from PIL import Image,ImageTk<br>root=Tk()<br>cv=Canvas(root,bg='black')<br>cv.pack(side=TOP,expand=True,fill=BOTH)<br>image=Image.open("bh.png","r")<br>image=image.resize((100,100))<br>imtk=ImageTk.PhotoImage(image)<br>id=cv.create_image(100,100,image=imtk)<br>cv.after(20,animate)<br>root.mainloop()

二、实现图片旋转

打开冗长的turtle模块的源代码, (读了半天)找到了TurtleScreenBase类, 该类用于底层的绘制图形等操作。程序的关键是使用自定义的函数替换turtle模块中原有的函数。

完整代码如下:

 

1
<br>from turtle import *<br>from turtle import TurtleScreenBase<br>try:<br>    from PIL import Image,ImageTk<br>except ImportError:<br>    Image=None<br>images={}<br># 使用自定义的函数替换turtle模块中原有的函数<br>def _image(self,filename):<br>    img=Image.open(filename)<br>    im = ImageTk.PhotoImage(img)<br>    im.raw = img<br>    im.zoomcache = [None,None]<br>    return im<br>def _createimage(self, image):<br>    "Create and return image item on canvas."<br>    id = self.cv.create_image(0, 0, image=image)<br>    return id<br>def _drawimage(self, item, pos, image, angle=None,zoom=None):<br>    "Configure image item as to draw image object at position (x,y) on canvas)"<br>    w=self.window_width();h=self.window_height()<br>    if not (-h//2 < pos[1] < h//2\<br>        and -w//2 <= -pos[0] < w//2):<br>        self.cv.itemconfig(item, image=self._blankimage()) # 清除图像<br>        return<br>    prev=image<br>    if zoom:<br>        # zoomcache为列表, 格式为[<放大倍数>, <图像>], 用于储存图像放大后的副本<br>        if zoom == image.zoomcache[0]:<br>            image=image.zoomcache[1]<br>        else:<br>            raw=image.raw<br>            size=(int(raw.size[0] * zoom), int(raw.size[1] * zoom))<br>            raw = raw.resize(size,resample=Image.BILINEAR)<br>            image=ImageTk.PhotoImage(raw)<br>            image.raw=raw<br>            prev.zoomcache=[zoom,image]<br>    if angle is not None:<br>        <br>        raw=image.raw<br>        image=ImageTk.PhotoImage(raw.rotate(angle))<br>        image.raw=raw<br>        <br>    images[item]=image # 创建 img 的引用, 防止img消失<br>    x, y = pos<br>    self.cv.coords(item, (x * self.xscale, -y * self.yscale))<br>    self.cv.itemconfig(item, image=image)<br>def register_shape(self, name, shape=None):<br>    if shape is None:<br>        if name.lower()[-3:] in (".gif","jpg","bmp","png"):<br>            shape = Shape("image", self._image(name))<br>        else:<br>            raise TurtleGraphicsError("Bad arguments for register_shape.\n"<br>                                      + "Use  help(register_shape)" )<br>    # 从turtle模块复制的部分<br>    elif isinstance(shape, tuple):<br>        shape = Shape("polygon", shape)<br>    ## else shape assumed to be Shape-instance<br>    self._shapes[name] = shape<br># turtle的_drawturtle方法, 当Turtle的形状将要绘制时调用<br>def _drawturtle(self):<br>        """Manages the correct rendering of the turtle with respect to<br>        its shape, resizemode, stretch and tilt etc."""<br>        # 从turtle模块复制的部分<br>        screen = self.screen<br>        shape = screen._shapes[self.turtle.shapeIndex]<br>        ttype = shape._type<br>        titem = self.turtle._item<br>        if self._shown and screen._updatecounter == 0 and screen._tracing > 0:<br>            self._hidden_from_screen = False<br>            tshape = shape._data<br>            if ttype == "polygon":<br>                if self._resizemode == "noresize": w = 1<br>                elif self._resizemode == "auto": w = self._pensize<br>                else: w =self._outlinewidth<br>                shape = self._polytrafo(self._getshapepoly(tshape))<br>                fc, oc = self._fillcolor, self._pencolor<br>                screen._drawpoly(titem, shape, fill=fc, outline=oc,<br>                                                      width=w, top=True)<br>            elif ttype == "image":<br>                # 形状为图像时<br>                screen._drawimage(titem, self._position, tshape,<br>                                  self.heading(),self._stretchfactor[0])<br>            elif ttype == "compound":<br>                for item, (poly, fc, oc) in zip(titem, tshape):<br>                    poly = self._polytrafo(self._getshapepoly(poly, True))<br>                    screen._drawpoly(item, poly, fill=self._cc(fc),<br>                                     outline=self._cc(oc), width=self._outlinewidth, top=True)<br>        else:<br>            if self._hidden_from_screen:<br>                return<br>            if ttype == "polygon":<br>                screen._drawpoly(titem, ((0, 0), (0, 0), (0, 0)), "", "")<br>            elif ttype == "image":<br>                screen._drawimage(titem, self._position,<br>                                          screen._shapes["blank"]._data)<br>            elif ttype == "compound":<br>                for item in titem:<br>                    screen._drawpoly(item, ((0, 0), (0, 0), (0, 0)), "", "")<br>            self._hidden_from_screen = True<br>if Image:<br>    TurtleScreenBase._image=_image<br>    TurtleScreenBase._createimage=_createimage<br>    TurtleScreenBase._drawimage=_drawimage<br>    TurtleScreen.register_shape=register_shape<br>    RawTurtle._drawturtle=_drawturtle<br>scr=getscreen()<br>scr.register_shape('blackhole.jpg')<br>shape('blackhole.jpg')<br>while True:<br>    forward(60)<br>    left(72)<br>done()

 

以上就是 直播源码网站,点击图片可进行任意方向旋转功能实现的相关代码,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(305)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示