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

目录

  • 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.6winratio=0.8canwinra=canratio/winratio# 根据屏幕设置窗口显示大小window_width = int(screen_width * winratio)  # Set the window width to 80% of the screen widthwindow_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+xself.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 = xself.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.mzph.cn/news/236170.shtml

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

相关文章

学习使用echarts图表中formatter的用法,格式化数字金额,控制x轴、y轴展示长度

学习使用echarts图表中formatter的用法&#xff0c;格式化数字金额&#xff0c;控制x轴、y轴展示长度 控制金额长度两位小数&#xff0c;并去除多余.00效果图 控制文字长度完整代码 控制金额长度 series: [{name: ,type: bar,sort: none,label: { //饼图图形上的文本…

GitHub two-factor authentication开启教程

问题描述 最近登录GitHub个人页面动不动就有一个提示框”… two-factor authentication will be required for your account starting Jan 4, 2024 …“&#xff0c;点击去看了一下原来是GitHub对所有的用户登录都要开启双重身份认证&#xff0c;要在1月4号前完成 解决办法 …

玩转大数据19:数据治理与元数据管理策略

随着大数据时代的到来&#xff0c;数据已经成为企业的重要资产。然而&#xff0c;如何有效地管理和利用这些数据&#xff0c;成为了一个亟待解决的问题。数据治理和元数据管理是解决这个问题的关键。 1.数据治理的概念和重要性 数据治理是指对数据进行全面、系统、规范的管理…

易点易动固定资产集成飞书,实现固定资产的一站式高效管理

在现代商业环境中&#xff0c;固定资产管理对于企业的运营和成功至关重要。然而&#xff0c;传统的资产管理方式往往繁琐、容易出错&#xff0c;并且缺乏实时性和准确性。为了解决这些挑战&#xff0c;易点易动与飞书进行了集成合作&#xff0c;推出了一种全新的解决方案&#…

common-pool的GenericObjectPool源码创建borrowObject方法研读

对象池主要管理对象的池&#xff0c;包含借用&#xff0c;归还&#xff0c;添加对象&#xff0c;校验对象是否有效等管理功能 public T borrowObject(final long borrowMaxWaitMillis) throws Exception {assertOpen();final AbandonedConfig ac this.abandonedConfig;if (ac …

ASP.NET Core面试题之Redis高频问题

&#x1f388;&#x1f388;在.NET后端开发岗位中&#xff0c;如今也少不了、微服务、分布式、高并发高可用相关的面试题&#x1f388;&#x1f388; &#x1f44d;&#x1f44d;本文分享一些整理的Redis高频面试题&#x1f389; &#x1f44d;&#x1f44d;机会都是给有准备…

Springboot访问html页面

目录 1、html页面创建 2、打开application.properties,添加如下配置 3、Controller中的代码 4、测试效果 项目结构如图 1、html页面创建 在原有的项目resouces目录下创建static包,并在static下创建pages,然后在pages包下index.html. index.html内容 <!DOCTYPE html>…

打破微软封印面向未来创建.NET Framework4.8工程

摘要&#xff1a; 工程从.NET Framework 4.8升级到.NET 8.0&#xff0c;即使采用官方方案也是很繁琐的一件事情&#xff0c;而且容易出问题。Windows 11内置了.NET Framework 4.8&#xff0c;所以当前的软件需要基于.NET Framework 4.8。但后续微软推出Windows 12&#xff0c;…

海康威视IP网络对讲广播系统命令执行漏洞(CVE-2023-6895)

漏洞介绍 海康威视IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 Hikvision Intercom Broadcasting System 3.0.3_20201113_RELEASE(HIK)版本存在操作系统命令注入漏洞&#xff0c;该漏洞源于文件/ph…

Linux网络编程(一):网络基础(下)

参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 网络编程 1. 协议的概念 1.1 什么是协议 从应用的角度出发&#xff0c;协议可理解为 “规则”&#xff0c;是数据传输和数据解释的规则 假设&#xff0c;A、B双方欲传输文件&#xff0c;规定&#xff1a; 第一次&#xff…

基于vue-cli快速发布vue npm 包

一、编写组件 1. 初始化项目并运行 vue create vue-digital-countnpm run serve2. 组件封装 新建package文件夹 ​ 因为我们可能会封装多个组件&#xff0c;所以在src下面新建一个package文件夹用来存放所有需要上传的组件。 ​ 当然&#xff0c;如果只有一个组件&#xff…

Guava事件总线的应用与最佳实践

第1章&#xff1a;引言 走过路过不要错过&#xff01;今天&#xff0c;小黑带大家深入了解Guava事件总线&#xff08;EventBus&#xff09;。咱们先聊聊&#xff0c;为什么这个东西这么酷&#xff1f;如果你是一名Java开发者&#xff0c;肯定知道&#xff0c;管理复杂的应用程…

JS常用方法

1、reduce()统计 &#xff08;1&#xff09;数组和 计算并返回给定数组 arr 中所有元素的总和 let arr [1,4,3,6,2,6] function sum(){const newArr arr.reduce((pre,item)>{return preitem})console.log(newArr);//22 } sum() 2、filter()过滤器 &#xff08;1&#…

HarmonyOS:Neural Network Runtime 对接 AI 推理框架开发指导

场景介绍 Neural Network Runtime 作为 AI 推理引擎和加速芯片的桥梁&#xff0c;为 AI 推理引擎提供精简的 Native 接口&#xff0c;满足推理引擎通过加速芯片执行端到端推理的需求。 本文以图 1 展示的 Add 单算子模型为例&#xff0c;介绍 Neural Network Runtime 的开发流…

精通服务器远程管理:全面指南

引言 在当今数字化世界中&#xff0c;IT专业人员和管理员能够远程管理服务器的能力是无价之宝。远程服务器管理不仅提高了效率&#xff0c;而且在无法物理访问服务器的情况下确保了持续的运营。本指南将深入探讨远程管理的不同类型、远程桌面的使用方法&#xff0c;以及如何安全…

一、W5100S/W5500+RP2040之MicroPython开发<静态网络示例>

文章目录 1. 前言2. MicroPython介绍2.1 简介2.2 优点2.3 应用 3. WIZnet以太网芯片4. 静态IP网络设置示例讲解以及使用4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 烧录验证步骤1&#xff1a;将固件部署到设备步骤2&#xff1a;运行network_install.py程序步骤3&a…

【大数据存储与处理】实验一 HBase 的基本操作

一、实验目的&#xff1a; 1. 掌握 Hbase 创建数据库表及删除数据库表 2. 掌握 Hbase 对数据库表数据的增、删、改、查。 二、实验内容&#xff1a; 1、题目 0&#xff1a;进入 hbase shell 2、题目 1&#xff1a;Hbase 创建数据库表 创建数据库表的命令&#xff1a;create 表…

重塑数字生产力体系,生成式AI将开启云计算未来新十年?

科技云报道原创。 今天我们正身处一个历史的洪流&#xff0c;一个巨变的十字路口。生成式AI让人工智能技术完全破圈&#xff0c;带来了机器学习被大规模采用的历史转折点。 它掀起的新一轮科技革命&#xff0c;远超出我们今天的想象&#xff0c;这意味着一个巨大的历史机遇正…

【扩散模型】8、DALL-E2 | 借助 CLIP 的图文对齐能力来实现文本到图像的生成

文章目录 一、背景二、方法2.1 Decoder2.2 Prior 三、图像控制3.1 Variations3.2 Interpolations3.3 Text Diffs 四、探索 CLIP 的潜在空间五、文本到图像的生成5.1 先验的重要性5.2 人类评价5.3 多样性和保真性的平衡5.3 在 COCO 上对比 论文&#xff1a;DALLE.2 代码&#x…

JVM-12-即时编译器

Java程序最初都是通过解释器&#xff08;Interpreter&#xff09;进行解释执行的&#xff0c;当虚拟机发现某个方法或代码块的运行特别频繁&#xff0c;就会把这些代码认定为“热点代码”&#xff08;Hot Spot Code&#xff09;&#xff0c;为了提高热点代码的执行效率&#xf…