最近学习TK,想写个小项目。正好那原来发过的这个主题进行改进下。

先上图看个效果:

设计思路如下:

1.选择微信图片文件夹路径

2.读取文件夹下文件,加载到Treeview里(可以学习到Treeview的使用)

3.选中行时,TK Label中显示图片

难点一:(TK,不支持jpg,所以需要用PIL来处理)

难点二:自然是微信图片转位图片的关键部分

4.加保存图片按钮,可在原路径下生成图片。删除图片按钮,可以删除不需要的dat文件,减少空间

源代码可生成的exe文件,链接如下:

微信图片DAT格式解码为图片

完整代码如下,未做整理,仅供学习:

#!/usr/bin/env python
# Author:Veray Zhou
import tkinter as tk
from tkinter.filedialog import *
from tkinter.ttk import *
import os
from PIL import Image, ImageTk
from io import BytesIOwindow = tk.Tk()
window.title('电脑端微信用户图片DAT格式解码为图片')
window.geometry('450x750')files = []
dir_path = ''
newfile_path = ''def showFiles(dir_path):inFiles = os.listdir(dir_path)i = 1files.clear()for file in inFiles:# 获取文件类型filetype = os.path.splitext(file)[1]if filetype == '.dat':# 获取文件大小filesize = os.path.getsize(os.path.join(dir_path, file))#序号 文件名 文件大小files.append((i, file, '{:.2f}KB'.format(filesize/float(1024))))i += 1# print(files)return filesdef select_path():global dir_pathdir_path = askdirectory()e.delete(0, 'end')e.insert(0, dir_path)delete_all()if dir_path:files = showFiles(dir_path)insert()def insert():print(files)for index, file in enumerate(files):datagrid.insert('', END, values=file)print(files)# 默认选中首行if files:datagrid.selection_set(datagrid.get_children()[0])def delete_all():items = datagrid.get_children()for item in items:datagrid.delete(item)def select(*args):print(datagrid.selection())selectItem = datagrid.item(datagrid.selection())['values']filename = selectItem[1]showImage(filename)def showImage(filename):createTempPic(dir_path, filename)def createTempPic(files_dir_path, filename):filePath = os.path.join(files_dir_path, filename)f1 = open(filePath, 'rb')infilebytes = f1.read()newfile = []global newfile_path#print(os.path.join(os.path.dirname(filePath), 'temp.jpg'))# 判断图片类型JPG,通过异或判定if (infilebytes[0] ^ 0xFF) == (infilebytes[1] ^ 0xD8):y1 = infilebytes[0] ^ 0xFFprint('%s,文件是JPG图片,每个字节是根据0x%X异或进行加密' % (filePath, y1))# # 字节进行异或转换,组合成新的文件for i in infilebytes:newbyte = i ^ y1newfile.append(newbyte)newfile2 = bytes(newfile)# 显示图片show(newfile2)# 判断图片类型PNG,通过异或判定elif (infilebytes[0] ^ 0x89) == (infilebytes[1] ^ 0x50):y1 = infilebytes[0] ^ 0x89print('%s,文件是PNG图片,每个字节是根据0x%X异或进行加密' % (filePath, y1))for i in infilebytes:newbyte = i ^ y1newfile.append(newbyte)newfile2 = bytes(newfile)# 显示图片show(newfile2)# 判断图片类型GIF,通过异或判定elif (infilebytes[0] ^ 0x47) == (infilebytes[1] ^ 0x49):y1 = infilebytes[0] ^ 0x47print('%s,文件是GIF图片,每个字节是根据0x%X异或进行加密' % (filePath, y1))for i in infilebytes:newbyte = i ^ y1newfile.append(newbyte)newfile2 = bytes(newfile)# 显示图片show(newfile2)else:print('%s无法识别的类型!' % filePath)newfile_path = ''print('图片已显示!')# 保存图片
def SavePic(files_dir_path, filename):filePath = os.path.join(files_dir_path, filename)f1 = open(filePath, 'rb')infilebytes = f1.read()newfile = []global newfile_path# 判断图片类型JPG,通过异或判定if (infilebytes[0] ^ 0xFF) == (infilebytes[1] ^ 0xD8):y1 = infilebytes[0] ^ 0xFFprint('%s,文件是JPG图片,每个字节是根据0x%X异或进行加密' % (filePath, y1))# # 字节进行异或转换,组合成新的文件for i in infilebytes:newbyte = i ^ y1newfile.append(newbyte)newfile2 = bytes(newfile)# 写入新文件f2 = open(os.path.join(files_dir_path, filename.lower().replace('.dat', '.jpg')), 'wb')f2.write(newfile2)# 判断图片类型PNG,通过异或判定elif (infilebytes[0] ^ 0x89) == (infilebytes[1] ^ 0x50):y1 = infilebytes[0] ^ 0x89print('%s,文件是PNG图片,每个字节是根据0x%X异或进行加密' % (filePath, y1))for i in infilebytes:newbyte = i ^ y1newfile.append(newbyte)newfile2 = bytes(newfile)f2 = open(os.path.join(files_dir_path , filename.lower().replace('.dat', '.png')), 'wb')f2.write(newfile2)# 判断图片类型GIF,通过异或判定elif (infilebytes[0] ^ 0x47) == (infilebytes[1] ^ 0x49):y1 = infilebytes[0] ^ 0x47print('%s,文件是GIF图片,每个字节是根据0x%X异或进行加密' % (filePath, y1))for i in infilebytes:newbyte = i ^ y1newfile.append(newbyte)newfile2 = bytes(newfile)f2 = open(os.path.join(files_dir_path, filename.lower().replace('.dat', '.gif')), 'wb')f2.write(newfile2)else:print('%s无法识别的类型!' % filePath)print('生成结束')def show(newfile2):w_box=423h_box=310bytes_stream = BytesIO(newfile2)img_open = Image.open(bytes_stream)img_open_resize = img_open.resize((w_box,h_box))# print(img_open)img = ImageTk.PhotoImage(image=img_open_resize)# print(img)label_show.config(image=img,width=w_box, height=h_box)label_show.image =img# def show():
#     w_box=422
#     h_box=400
#     aa = os.path.join(dir_path, 'temp.png')
#     print(aa)
#     img_open = Image.open(aa)
#     img_open_resize = img_open.resize((w_box,h_box))
#     print(img_open)
#     img = ImageTk.PhotoImage(image=img_open_resize)
#     print(img)
#     label_show.config(image=img,width=w_box, height=h_box)
#     label_show.image =imge = tk.Entry(window, width=40 )
e.place(x=10, y=20)var1 = tk.StringVar()
b = tk.Button(window, text='打开文件夹', width=10, command=select_path)
b.place(x=310, y=16)ybar = Scrollbar(window, orient="vertical")
ybar.place(x=420, y=49, height=329)
datagrid = Treeview(window, height=15, show='headings', column=('no', 'filename', 'filesize'), yscrollcommand=ybar.set)
ybar['command'] = datagrid.yviewdatagrid.heading('no', text='序')
datagrid.heading('filename', text='文件名')
datagrid.heading('filesize', text='文件大小')datagrid.column('no', width=30, minwidth=30, anchor=CENTER)
datagrid.column('filename', width=300, minwidth=280, anchor=CENTER)
datagrid.column('filesize', width=80, minwidth=80, anchor=CENTER)datagrid.place(x=10, y=50)datagrid.bind('<<TreeviewSelect>>',select)label_show = tk.Label(window,borderwidth=1,bg='black',width=60,height=18)
label_show.place(x=10,y=380)def preSel():preItem = datagrid.prev(datagrid.selection())if preItem:datagrid.selection_set(preItem)else:print('已经是第一条记录')preButton = tk.Button(window,text='上一张',width=10, command=preSel)
preButton.place(x=20, y=700)def nextSel():nextItem = datagrid.next(datagrid.selection())if nextItem:datagrid.selection_set(nextItem)else:print('已经是最后一条记录')nextButton = tk.Button(window,text='下一张',width=10, command=nextSel)
nextButton.place(x=120, y=700)
def save():selectItem = datagrid.item(datagrid.selection())['values']filename = selectItem[1]SavePic(dir_path, filename)saveButton = tk.Button(window,text='保存图片',width=10,command=save)
saveButton.place(x=220, y=700)def deletePic(files_dir_path, filename):filePath = os.path.join(files_dir_path, filename)print(filePath)if os.path.isfile(filePath):os.remove(filePath)print('删除成功')else:print('文件不存在')def delete():selectItem = datagrid.item(datagrid.selection())['values']filename = selectItem[1]deletePic(dir_path, filename)datagrid.delete(datagrid.selection())delButton = tk.Button(window,text='删除图片',width=10, command=delete)
delButton.place(x=320, y=700)window.mainloop()

电脑端微信用户图片DAT格式解码为图片(TK版)相关推荐

  1. PC端微信下的dat 文件在线解码还原成为图片

    之前的时候很多人都咨询问微信的dat文件怎么才能打开?有没有什么软件能打开微信dat文件? 看了下网上的说明,发现就是异或处理,于是准备将微信dat的转码做出来,方便大家. 原理: 微信dat文件在微 ...

  2. Windows微信聊天图片文件的解码和图片、视频占满电脑磁盘空间的清理

    1 问题现象 我的Windows版微信最近老是提示"磁盘空间不足200MB,需及时清理磁盘". 使用文件资源管理器查看我的电脑磁盘使用情况,发现C盘只剩下174MB空间可用.系统盘 ...

  3. 电脑朋友圈,可以用电脑刷朋友圈了(电脑端微信怎么刷朋友圈)

    今天在我用手机刷朋友圈时. 老板突然出现在我身后,生气地对我说: "怎么还在玩手机!你今天的选题确定了没?" 我支支吾吾地回答到:"额--还在找还在找." 我就 ...

  4. CAD版本转换,电脑端如何转换CAD图纸格式?

    在日常的CAD制图中,我们常常在电脑端转换CAD图纸格式.CAD版本转换,电脑端如何转换CAD图纸格式? 1.我们先启动运行安装到电脑端的CAD转换器,进入到软件操作界面. 2.在CAD转换器操作界面 ...

  5. 微信电脑客户端登陆_电脑端微信多开教程,多个微信同时登陆,工作生活两不误...

    微信已经成为我们生活中不可缺少的一个社交软件,无论是生活还是工作都会用到. 它可以跨平台使用,电脑端,网页端,手机端都可以使用,很多人都会在电脑上面安装一个微信,因为电脑端打字速度快,便于沟通聊天. ...

  6. 上微信怎么同时用计算机,电脑端微信双开,教你两种简单的方法,上手即用!...

    原标题:电脑端微信双开,教你两种简单的方法,上手即用! 微信现在已不单单是社交软件了,如今已成了工作必备软件,每天上班微信电脑端一登,传个文件,发个群通知,实在方便. 但是很多人都不止有一个微信号,电 ...

  7. html实现在线聊天,利用HTML5实现电脑端微信聊天窗口界面

    特效描述:利用HTML5实现 电脑端 微信聊天 窗口界面.利用HTML5实现电脑端微信聊天窗口界面 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 Thomas Bangalter 2 ...

  8. 电脑端微信双开,教你两种简单的方法,上手即用!

    电脑端微信双开,教你两种简单的方法,上手即用! https://kuaibao.qq.com/s/20181117A0GAZF00?refer=spider 微信现在已不单单是社交软件了,如今已成了工 ...

  9. 电脑端微信多开批处理命令

    电脑端微信多开批处理命令 @echo offecho 请务必关闭已打开的微信,然后在运行此文件set WeChatPath=D:\Program Files (x86)\Tencent\WeChat\ ...

  10. 电脑端微信有很多垃圾可以清理

    电脑端微信有很多垃圾可以清理: 在位置: C:\Users\hdy\Documents\WeChat Files\HDY99818864\FileStorage\File 每个月的垃圾都缓存在这里: ...

最新文章

  1. 2003迁移到 Server 2008
  2. Jquery 添听checkbox 是否选中
  3. python学习笔记(八)类(classes)
  4. leetcode 455. 分发饼干(贪心算法)
  5. 【笔试/面试】—— 有向无环图(DAG)的最短路径问题(动态规划)
  6. TypeScript 再次发布一个奇怪的版本:3.3.4000
  7. 想打造一款成功的移动应用?你最需要关注性能指标!
  8. android获取根视图
  9. 华为路由器OSPF基础配置命令
  10. Window10环境下安装VMware12
  11. DOS 批处理高级教程精选合编20080331
  12. Android常用浏览器,常用六款经典Android平台浏览器推荐
  13. c语言启动程序句柄无效,U盘上打开EXE文件提示句柄无效
  14. Linux监控软件之 Nagios
  15. 机器人编程需要c语言吗,机器人编程和计算机编程有什么不一样
  16. GitHub重磅官宣!抖音四面被拒,再战头条终获offer
  17. c++中文正则的使用
  18. 102类花卉分类数据集(已划分,有训练集、测试集、验证集标签)
  19. mysql怎么添加索引
  20. linux仿win7,Linux游戏:原生、Wine模拟对比Win7

热门文章

  1. 如何快速注册一个谷歌gmail邮箱(2021)
  2. 更新win7原版镜像中添加usb3.0驱动
  3. 淘宝商品列表以及商品详情数据抓取
  4. 华为社招16级待遇2020_2020年3月16日乌鲁木齐沙依巴克区发生3.5级地震简报
  5. 【嵌入式】---- 单片机常用单位
  6. 测试用例编写八大要素
  7. html5家谱制作模板,Word如何做家谱世系图?
  8. s7scan 安装使用教程
  9. Vue - 中文汉字转拼音(工具函数封装)
  10. fastdb缩小初始生成文件