python实现一个图片查看器——可拖动、缩放和颜色画笔

news2024/12/24 10:15:32

目录

  • 0 前言
  • 1 准备工作
  • 2 窗口布局
  • 3 图片显示功能
  • 3 图片拖拽功能
  • 4 图片缩放功能(难度大)
  • 5 画笔功能
  • 6 颜色选择功能
  • 后记
  • 源码

0 前言

在现如今的数字时代,我们对于图片的需求越来越大。无论是在工作中,还是在日常生活中,我们都经常需要查看、编辑和操作各种类型的图片。为了满足这个需求,开发一款图片查看器是非常有必要的。
在这里插入图片描述

Python作为一种简单而强大的编程语言,提供了丰富的图像处理库和工具。借助于Python的图像处理功能,我们可以轻松地创建一个功能强大的图片查看器,实现图片的拖动、缩放和颜色画笔等功能。

在本博客中,我们将使用Python的图形用户界面库pysimplegui来实现这个图片查看器。pysimplegui是一款易于使用、功能丰富的GUI库,它可以帮助我们快速创建各种类型的图形用户界面。

通过本博客,我们将一步步地介绍如何使用pysimplegui库来创建一个图片查看器。首先,我们将学习如何加载和显示图片,并实现拖动和缩放功能。然后,我们将介绍如何使用颜色画笔工具,在图片上进行绘制操作。
在这里插入图片描述

通过学习本博客,您将能够掌握使用Python和pysimplegui库来创建一个功能强大的图片查看器的技巧。无论您是初学者还是经验丰富的开发者,本博客都将为您提供有用的知识和实践经验。

让我们一起开始这个令人兴奋的学习之旅,探索如何使用Python实现一个图片查看器!

在这里插入图片描述

1 准备工作

所需要安装如下python库,PySimpleGUI,pillow,tkinter,其中,Python3标准安装包中自带tkinter,即不用安装,导入即可使用。其它版本如下:
在这里插入图片描述
在这里插入图片描述

import PySimpleGUI as sg
from PIL import Image, ImageTk

2 窗口布局

窗口主要包含了路径选择器,颜色选择器,画笔粗细选择、拖动切换及图片显示画布:
在这里插入图片描述

layout = [ 
        [sg.Text('选择图像(png,jpg):'), sg.In(key='file'), sg.FileBrowse(file_types=( (("Image Files", "*.jpg;*.png"),)))], 
        [sg.Text('画笔粗细:'), sg.Slider((1, 100),1,1,orientation='h', size=(50, 15), key='slider')],         
        [sg.ColorChooserButton('选择颜色',key='chose', target='-COLOR-'),sg.Button('',key='color'),sg.In('', key='-COLOR-')],
        [sg.Text('画图:'),sg.Radio('OFF',"222",default=True,k='-off-'),sg.Radio('ON', "222",key="-on-")],
        [sg.Stretch(),can,sg.Stretch()],         
         ]

这里有个小细节,就是,窗口面对多种电脑的显示器尺寸,做了自适应的调整,这样就不会因为电脑显示器的大小,影响窗口的显示效果:

	#获取屏幕的大小
    screen_width, screen_height = sg.Window.get_screen_size()
    canratio=0.6
    winratio=0.8
    canwinra=canratio/winratio
    # 根据屏幕设置窗口显示大小
    window_width = int(screen_width * winratio)  # Set the window width to 80% of the screen width
    window_height = int(screen_height * winratio)  # Set the window height to 80% of the screen height

3 图片显示功能

这个直接可以通过Pillow库读取图片所在路径打开图片,并转化到tk能显示的图片格式即可。

def set_image(self, image_path):
        self.canvas.delete('all')
        #读取选择路径的图片
        self._image = Image.open(image_path)
        #转化为tk能读的格式
        self._image_tk = ImageTk.PhotoImage(self._image)
        #在画布上显示
        self.canvas.create_image(0, 0, image=self._image_tk, anchor="nw", tags="image")
        self.canvas.tag_lower("image")

3 图片拖拽功能

图片拖拽功能,使用了tkcanvas中的.scan_dragto()函数,是利用鼠标按下时记住当前点的坐标,然后通过鼠标的移动move事件,将画布坐标系scan到指定偏移量:

	#将下面两个函数与事件绑定
    self.canvas.bind("<ButtonPress-1>", self.scroll_start)#左键按下
    self.canvas.bind("<B1-Motion>", self.scroll_move)#左键移动
	#鼠标按下时记录拖动起点
	def scroll_start(self, event):         
        self.canvas.scan_mark(event.x, event.y)
    #鼠标移动时移动画布
    def scroll_move(self, event):     
    	self.canvas.scan_dragto(event.x, event.y, gain=1)

4 图片缩放功能(难度大)

图片缩放功能有一定的难度,需要计算几个坐标系的变化关系,画布严格说涉及到三个坐标系,一个时全局坐标系O,一个时画布自身坐标系Os,还有一个是画图缩放坐标系Od。大概的位置如下:
在这里插入图片描述其中O系和Os系可以通过自带函数转化:

Osx=self.canvas.canvasx(Ox)
Osy=self.canvas.canvasy(Oy)

O系是一个全局坐标,任何时候都是不变的。
Os系对缩放无感,根据平移会改变原点。
Od系是一个比较头疼的坐标系,他是根据Os系任意一点鼠标的位置经过N次缩、放后的存在。
这里图片如果要完美的跟着鼠标某点缩放,就要计算出每次滑轮滚动后的Os原点在Od系得坐标,坐标公式如下:

#self.prevzx为Os得原点,x为在Os系下缩放中心坐标,scale_factor为滚轮单位缩放因子
self.prevzx=(self.prevzx-x)*scale_factor+x
self.prevzy=(self.prevzy-y)*scale_factor+y

以上需要在滚轮事件中反复计算,保持记录self.prevzx,self.prevzy得坐标,即为图像得左上角,核心代码如下:

def _on_mousewheel(self, event):
        x = self.canvas.canvasx(event.x)
        y = self.canvas.canvasy(event.y)       
        scale_factor = 1.1 if event.delta > 0 else 1/1.1        
        self._scale *= scale_factor
        #执行缩放
        self.canvas.scale("all", x, y, scale_factor, scale_factor)
        #记录Os原点坐标
        self.prevzx=(self.prevzx-x)*scale_factor+x
        self.prevzy=(self.prevzy-y)*scale_factor+y

5 画笔功能

画笔功能,直接利用自带得self.canvas.create_line()函数实现即可,注意这里坐标要转化到Os系得坐标,然后执行直线函数:

#此为鼠标移动事件回调函数
def scroll_move(self, event):        
        if painterable:#绘画模式
            x = self.canvas.canvasx(event.x)
            y = self.canvas.canvasy(event.y)           
            if self.prev_x and self.prev_y:
                   self.canvas.create_line(self.prev_x, self.prev_y, x, y, fill=color, width=width)
            self.prev_x = x
            self.prev_y = y 
        else: #拖拽模式           
            self.canvas.scan_dragto(event.x, event.y, gain=1)      

6 颜色选择功能

这个直接用gui得组件就可以:

if values['-COLOR-']!=color:
            selected_color=values['-COLOR-']
            window['color'].update(button_color=('white', selected_color))
            
            color=values['-COLOR-']

其它功能较为简单略过

后记

总的来说,这个项目不仅具有实用性,还提供了一种有趣的方式来探索Python的功能。希望我的博客可以帮助更多的人了解python。
python可以实现得东西非常多,以上只是一个简单实例,后面我们继续探索好玩得功能,更加AI得功能。
在这里插入图片描述

源码

全部源码已经上传:
资源链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1326136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SLAM算法与工程实践——SLAM基本库的安装与使用(6):g2o优化库(1)g2o库的安装

SLAM算法与工程实践系列文章 下面是SLAM算法与工程实践系列文章的总链接&#xff0c;本人发表这个系列的文章链接均收录于此 SLAM算法与工程实践系列文章链接 下面是专栏地址&#xff1a; SLAM算法与工程实践系列专栏 文章目录 SLAM算法与工程实践系列文章SLAM算法与工程实践…

PostGIS轨迹分析——横跨180°经线

问题描述 在处理AIS数据中&#xff0c;经常会遇到轨迹线横穿180经线的情况&#xff0c;这种数据绘制到地图上显示的非常乱&#xff0c;如下图所示&#xff1a; 数据模拟 在geojson.io上模拟一条轨迹线&#xff0c;可以看到轨迹显示的非常好&#xff0c;红框里面的经纬度超过…

使用Alpha Vantage API和Python进行金融数据分析

Alpha Vantage通过一套强大且开发者友好的数据API和电子表格&#xff0c;提供实时和历史的金融市场数据。从传统资产类别&#xff08;例如股票、ETF、共同基金&#xff09;到经济指标&#xff0c;从外汇汇率到大宗商品&#xff0c;从基本数据到技术指标&#xff0c;Alpha Vanta…

HashSet使用-力扣349做题总结

349. 两个数组的交集 分析代码HashSet出错的知识点1、HashSet新建2、HashSet添加add3、是否包含某元素4、集合->数组5、增强for循环 分析 没做出来的原因代码随想录的视频文字学习 为什么没做出来&#xff0c;因为没有理解好题意。根据示例1可知是去重的。且题目明确说“不考…

机器学习算法(12) — 集成技术(Boosting — Xgboost 分类)

一、说明 时间这是集成技术下的第 4 篇文章&#xff0c;如果您想了解有关集成技术的更多信息&#xff0c;您可以参考我的第 1 篇集成技术文章。 机器学习算法&#xff08;9&#xff09; - 集成技术&#xff08;装袋 - 随机森林分类器和...... 在这篇文章中&#xff0c;我将解释…

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

在新一轮科技革命和产业变革的推动下&#xff0c;制造业正面临绿色化、智能化、服务化和定制化发展趋势。为顺应新技术革命及工业发展模式变化趋势&#xff0c;传统工业化理论需要进行修正和创新。其中&#xff0c;对工业化水平的判断标准从以三次产业比重标准为主回归到工业技…

服务器数据恢复-昆腾存储StorNext文件系统下raid5数据恢复案例

服务器数据恢复环境&#xff1a; 昆腾某型号存储&#xff0c;StorNext文件存储系统。 共有9个分别配置了24块磁盘的磁盘柜&#xff0c;其中8个磁盘柜存放普通数据&#xff0c;1个磁盘柜存放元数据。 存放元数据的磁盘柜中的24块磁盘组建了8组RAID1阵列和1组4盘RAID10阵列&#…

Ubuntu 常用命令之 history 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 history命令在Ubuntu系统中用于显示用户执行过的命令列表。这个命令在bash shell中非常有用&#xff0c;特别是当你需要记住你之前执行过的命令时。 history命令的参数如下 -c&#xff1a;清除历史记录。-d offset&#xff1a;删…

全功能知识付费小程序系统源码是什么?有什么好处?

全功能知识付费小程序系统源码&#xff0c;是一个集课程管理、用户管理、支付管理、数据分析等于一体的综合性解决方案。它支持多种形式的课程内容&#xff0c;如视频、音频、图文等&#xff0c;满足不同用户的学习需求。同时&#xff0c;系统具备完善的支付功能&#xff0c;保…

怎么开通独立站支付?独立站客户退款谁支付运费?——站斧浏览器

怎么开通独立站支付&#xff1f; 选择支付服务提供商&#xff1a;开通独立站支付首先需要选择一个可靠的支付服务提供商。目前市场上有许多知名的支付服务提供商&#xff0c;如支付宝、微信支付、PayPal等。根据自己的业务需求和目标市场选择合适的支付服务提供商。 注册账号…

目前电视盒子哪个最好?工程师盘点超值电视盒子推荐

因工作原因每天都会跟各种各样类型的电视盒子打交道&#xff0c;拆机、维修&#xff0c;身边朋友在挑选电视盒子的时候会问我目前电视盒子哪个最好&#xff0c;哪些电视盒子最值得入手&#xff0c;我整理了五款超值电视盒子推荐给大家&#xff0c;在挑选电视盒子时可以把这几款…

两套高质量可视化模板套件,需要进!

小编整理了两套高质量可视化模板套件&#xff0c;均来自于山海鲸可视化&#xff0c;需要源文件可私。 一、「星曜蓝」主题可视化模板 可以自由调用模板库中的所有内容&#xff0c;轻松搭建风格统一的地图、工厂、城市多种数字孪生项目。真免费、0代码数字孪生设计搭建&#xf…

可狱可囚的爬虫系列课程 07:BeautifulSoup4(bs4)库的使用

前面一直在讲 Requests 模块如何使用&#xff0c;那都是在请求阶段要做的事情&#xff0c;相信很多网友都在等一个能够开始爬网站信息的教程&#xff0c;今天它来了&#xff0c;今天我要给大家讲一个很简单易懂的库&#xff1a;BeautifulSoup4。 一、概述&安装 Beautiful…

BWS2000倾角传感器c++测试代码【2】

问题一&#xff1a;串口频率的初始化 由于本次项目之中使用的线长为40米的倾角传感器&#xff0c;需要对于其频率输出存在要求&#xff0c;如何测试其频率如下所示&#xff1a; 如上所示相应的软件&#xff0c;软件中存在一句如果设置后不保存&#xff0c;则存在传感器断电后设…

众和策略:大盘涨手中的股票却大跌,到底怎么回事?

大盘涨手中的股票却大跌&#xff0c;究竟怎么回事&#xff1a; 1、大盘上涨是权重股所造成的 大盘上涨可能是受一些权重比较大的工作所影响&#xff0c;比如证券工作、钢铁工作、银行工作等等&#xff0c;这些工作的大涨&#xff0c;可以拉升大盘的上涨&#xff0c;可是其它工…

C++20形式的utf-8字符串转宽字符串,不依赖编译器编码形式

默认的char[]编码都是要看编译器编译选项的&#xff0c;你选了ANSI那它就是ANSI&#xff0c;你选了UTF8那它就是UTF8. 【注意&#xff1a;经典DevC只支持ANSI编码&#xff08;痛苦&#xff09;&#xff1b;上图是小熊猫DevC&#xff0c;则有这个选项】 这一点对我的代码造成了…

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞 2023/12/20 17:19 简略步骤&#xff1a;rootrootrootroot-X99-Turbo:~/3TB$ tar --use-compress-programpigz -xvpf rk3399-android-10.git-20210201.tgz rootrootro…

Poi实现复杂Excel导出,理解POI操作Excel思路!!!

前言 对于简单excel报表导出&#xff0c;有很多简单的工具如easypoi&#xff0c;而且现在网上已经有很多工具类整合easypoi使用起来非常方便。但是简单的弊端往往无法适配一些负责场景&#xff0c;而我们实际生产中面临的都是客户自定以的一个负责报表导出&#xff0c;这是利用…

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…

百川大模型AI对话实战——Python开发一个对话机器人

百川大模型开放提供API体验中心&#xff0c;体验不错&#xff0c;有小伙伴也对搭建自己的对话机器人比较兴趣&#xff0c;今天通过Python来简单介绍下&#xff0c;如何调用百川大模型的API来构建自己的小产品。 在开发环境中安装Python&#xff0c;如何安装&#xff1f;参照网…