logo 燕京驿站
  • 绿色软件
  • 手机游戏时光
  • 游戏时光
  • 游戏工具
  • 网游单机
  • 页游单机
  • 淘宝游戏
  • 登录
  • 国密SM4文件加解密工具

    国密SM4文件加解密工具

    注意:免费软件,未在其他电脑上做测试,也没有测试的条件,自行决定是否使用,对文件进行批量二进制读写可能会报病毒。在使用前还是建议大家找几个无用的文件试试是否可正常加密解密,然后再用来加解密有用的文件提醒:初次使用请重置SM4密钥,否则使用的是我写软件时默认的密钥,文件没有全部解密前,请不要删除数据库和软件,SM4密钥和IV一定要保存好文件加解密:文件加密是通过二进制读取文件的256个字节,然后对字节进行国密SM4加密并保存,从而实现快速加密的目的,它并不是完全加密,但是可以防止用户打开文件,需要注意的是密钥是明文保存在数据库中的,属于随机生成,所以不要去手动修改密钥,也需要保护好数据库,否则文件将无法解密。文件夹加解密:文件夹加密属于伪加密,并不会真正加密文件夹,先修改文件夹为畸形文件夹,使其不可访问,然后增加文件ALC规则,使everyone用户组不可读取,解密是先移除ALC规则,再把文件夹修改为正常的。前面写过一个文件夹加密小工具,后来发现只能加密文件夹还是有些功能单薄,就把重点放在文件加解密上了,但是文件加密存在一个问题,就是如果对文件整体进行加密的话,文件越大则加密速度越慢,并且加密后的文件体积也会变大,基本上就是分段读取-加密-保存-删除原文件这种操作,解密也是一样的,时间开销比较大,不符合大家的需求,那么就换一种思路,只读取文件的一部分,比如256个字节,然后对字节进行加密,再把加密后字节写回原来的位置,这样就无需对文件整体进行读写,自然速度也快,但是在二进制读取的方式下,从底层无法实现字节的查找替换,所以就要求加密前是256个字节的明文,那么加密后也一定得要是256个字节的密文才行,能符合这种要求的加密算法有经典密码算法、RC4加密、SM4加密等,RC4安全性较差,而SM4是国产加密算法,更好一些,SM4分为填充模式和无填充模式,在此只能选择无填充模式。文件加密从第10个字节开始进行读取,所以加密后的文件在外观上看和没加密时没有任何区别,文件大小也没有变化,只是无法打开使用了,同事看到你的文件打不开,只会认为你文件损坏不可用了,不会去想文件被加密了一部分,文件加密、解密时采用多线程进行处理,在执行加解密时不要对软件进行其他操作,可能会导致其他不可预知的错误,请耐心等待加密解完成后的提醒。不要对小文件进行加密,比如小于2k的文件,文件实际大小小于500个字节时,加密会出错,如果文件被占用,加密时也会出错,此版本只为实现功能,并未对细节进行处理。文件加解密时可以通过搜索文件名称或后缀名来查找你需要的文件,选中批量加解密后,点击加密和解密时将会对当前页面中显示的所有文件进行加解密。

  • 图片批量修改尺寸/图片批量格式转换

    图片批量修改尺寸/图片批量格式转换

    软件名称:熠点点·图片批量修改尺寸当前版本:1.2.0软件大小:v1.2新版本:57.7mb编程语言:python运行环境:Windows 图片本地批量修改尺寸 图片转换为png、bmp、webp、ico四种格式 单独转换格式,勾选转换格式,不填宽度高度。

  • 鼠标同步工具

    鼠标同步工具

    多个模拟鼠标,自己可以控制数量。这样就实现了模拟鼠标跟随物理鼠标。缺点有时间间隔,没法同时点击多个窗口。毕竟windows点击窗口要活动窗口才能点击。至于获取坐标大家可以自己用其他工具计算相对位置。

  • 图片压缩工具

    图片压缩工具

    在为网站上传图片时,经常会遇到对图片文件大小和分辨率的限制。为了确保图片符合这些要求而不失质量,图片压缩工具成为不可或缺的好帮手。这类工具不仅能够有效减小文件体积,还能保持图像的清晰度,确保网页加载速度不受影响。主要功能与优势:  1.智能压缩:利用先进的算法,在几乎不影响视觉效果的情况下减少图片文件的大小,确保图片符合网站的上传要求  2.格式转换:部分工具还提供格式转换功能,可以将图片转换为最适合网络使用的格式(如 JPEG、PNG 等多种图片格式),进一步优化文件大小。  3.自定义设置:允许用户调整压缩级别,根据具体需求平衡图片质量和文件大小。  4.即时预览:一些工具提供即时预览功能,让用户可以在压缩前后对比图片质量,确保最终效果满意。 代码源码在页面最下方,有需要的可以自行修改研究。 import os import re import tkinter as tk from tkinter import filedialog, messagebox, ttk from PIL import Image, ImageTk, UnidentifiedImageError import threading import logging # 设置日志配置 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') class ImageCompressorApp: def __init__(self, root): self.root = root self.root.title("图片压缩工具 by ke") self.root.geometry("1024x650") self.root.configure(bg="#f0f0f0") # 初始化变量 self.image_path = None # 图片路径 self.output_location = None # 输出位置 self.target_size_kb = tk.IntVar(value=400) # 默认目标大小为400KB self.new_filename = tk.StringVar() # 新文件名 self.output_format = tk.StringVar(value="JPG") # 修改默认输出格式为JPG # 创建界面元素 self.create_widgets() def create_widgets(self): main_frame = tk.Frame(self.root, bg="#f0f0f0") main_frame.pack(expand=True, fill='both', padx=20, pady=20) # 文件选择和预览 img_frame = tk.Frame(main_frame, bg="#f0f0f0") img_frame.pack(fill='x') self.img_label = tk.Label(img_frame, text="请加载一张图片", bg="#f0f0f0") self.img_label.pack(side=tk.LEFT, padx=10, pady=10) browse_button = tk.Button(img_frame, text="选择图片...", command=self.browse_files) browse_button.pack(side=tk.RIGHT, padx=10, pady=10) # 目标大小输入框 size_frame = tk.Frame(main_frame, bg="#f0f0f0") size_frame.pack(fill='x', pady=5) tk.Label(size_frame, text="目标大小 (KB):", bg="#f0f0f0").pack(side=tk.LEFT, padx=5) self.size_entry = tk.Entry(size_frame, textvariable=self.target_size_kb, width=10) self.size_entry.pack(side=tk.LEFT, padx=5) # 设置新文件名 filename_frame = tk.Frame(main_frame, bg="#f0f0f0") filename_frame.pack(fill='x', pady=5) tk.Label(filename_frame, text="新文件名:", bg="#f0f0f0").pack(side=tk.LEFT, padx=5) tk.Entry(filename_frame, textvariable=self.new_filename, width=30).pack(side=tk.LEFT, padx=5) # 选择输出格式 format_frame = tk.Frame(main_frame, bg="#f0f0f0") format_frame.pack(fill='x', pady=5) tk.Label(format_frame, text="输出格式:", bg="#f0f0f0").pack(side=tk.LEFT, padx=5) format_combobox = ttk.Combobox(format_frame, textvariable=self.output_format, values=["JPG", "JPEG", "PNG", "BMP", "GIF"], width=10) format_combobox.current(0) # 设置默认选中项为第一个选项,即"JPG" format_combobox.pack(side=tk.LEFT, padx=5) # 输出位置选择 output_frame = tk.Frame(main_frame, bg="#f0f0f0") output_frame.pack(fill='x', pady=5) tk.Label(output_frame, text="输出位置:", bg="#f0f0f0").pack(side=tk.LEFT, padx=5) self.output_location_var = tk.StringVar() tk.Entry(output_frame, textvariable=self.output_location_var, width=50).pack(side=tk.LEFT, padx=5) tk.Button(output_frame, text="选择...", command=self.select_output_location).pack(side=tk.LEFT, padx=5) # 创建一个容器用于放置压缩并保存按钮和进度条 bottom_frame = tk.Frame(self.root, bg="#f0f0f0") bottom_frame.pack(side=tk.BOTTOM, fill='x', pady=20) # 压缩并保存按钮 compress_button = tk.Button(bottom_frame, text="压缩并保存", command=self.start_compress_and_save) compress_button.pack(side=tk.LEFT, padx=10) # 进度条放在最下方 self.progress = ttk.Progressbar(bottom_frame, orient="horizontal", length=700, mode="determinate") self.progress.pack(side=tk.RIGHT, padx=10) def load_image(self, path): """加载并显示图片预览""" try: self.image_path = path img = Image.open(path) img.thumbnail((300, 300)) self.photo = ImageTk.PhotoImage(img) self.img_label.config(image=self.photo) except Exception as e: logging.error(f"加载图片时出错: {str(e)}") self.show_message("错误", f"加载图片时出错: {str(e)}") def browse_files(self): """打开文件对话框选择图片""" filename = filedialog.askopenfilename( title="选择图片", filetypes=[("Image files", "*.png *.jpg *.jpeg *.bmp *.gif")] ) if filename: self.load_image(filename) def select_output_location(self): """选择图片压缩后的输出位置""" directory = filedialog.askdirectory(title="选择输出位置") if directory: self.output_location_var.set(directory) def start_compress_and_save(self): """启动压缩线程并在UI上显示进度条""" self.progress["value"] = 0 # 初始化进度条为0% self.progress["maximum"] = 100 # 设置进度条的最大值为100% compress_thread = threading.Thread(target=self.compress_and_save) compress_thread.start() def compress_and_save(self): """执行图片压缩并保存到指定位置""" try: if not self.image_path or not self.output_location_var.get(): self.show_message("警告", "请选择图片和输出位置!") return new_filename = sanitize_filename(self.new_filename.get().strip()) if not new_filename: self.show_message("警告", "请输入有效的文件名!") return output_filename = f"{new_filename}.{self.get_output_extension()}" output_path = os.path.join(self.output_location_var.get(), output_filename) # 检查输出路径有效性 if not os.path.isdir(self.output_location_var.get()): logging.error(f"输出位置不存在: {self.output_location_var.get()}") self.show_message("错误", "选择的输出位置无效,请重新选择。") return # 检查是否有写权限 if not os.access(self.output_location_var.get(), os.W_OK): logging.error(f"没有写入权限: {self.output_location_var.get()}") self.show_message("错误", "没有足够的权限在选择的位置写入文件。") return target_size_kb = self.target_size_kb.get() original_size_kb = os.path.getsize(self.image_path) / 1024 if original_size_kb <= target_size_kb: self.show_message("提示", "原图大小已经小于或等于目标大小,无需压缩。") return self.compress_image(self.image_path, output_path, target_size_kb) self.set_progress_value(100) # 完成后设置进度条为100% self.show_message("成功", "图片已成功压缩并保存!") except Exception as e: logging.error(f"压缩失败: {str(e)}") self.show_message("错误", f"压缩失败: {str(e)}") finally: self.progress.stop() def compress_image(self, image_path, output_path, target_size_kb): """压缩图片至指定大小""" try: img = Image.open(image_path).convert('RGB') # 确保图片模式兼容 quality = 95 original_size_kb = os.path.getsize(image_path) / 1024 format_name = self.get_output_format() # 获取正确的格式名称 while original_size_kb > target_size_kb and quality >= 10: try: img.save(output_path, format=format_name, optimize=True, quality=quality) original_size_kb = os.path.getsize(output_path) / 1024 quality -= 5 self.update_progress(quality) except IOError as e: logging.error(f"IO 错误: {str(e)}") raise ValueError(f"IO 错误: {str(e)}") except Exception as e: logging.error(f"保存图片时出错: {str(e)}") raise ValueError(f"保存图片时出错: {str(e)}") if original_size_kb > target_size_kb: raise ValueError("无法将图片压缩到指定大小!请尝试增加目标大小或减少图片复杂度。") except UnidentifiedImageError: logging.error("无法识别的图片格式") self.show_message("错误", "无法识别的图片格式,请选择其他图片。") except Exception as e: logging.error(f"压缩图片时出错: {str(e)}") self.show_message("错误", f"压缩图片时出错: {str(e)}") def get_output_extension(self): """根据输出格式返回正确的文件扩展名""" format_name = self.output_format.get().upper() if format_name in ["JPG", "JPEG"]: return "jpg" elif format_name == "PNG": return "png" elif format_name == "BMP": return "bmp" elif format_name == "GIF": return "gif" else: return "jpg" def get_output_format(self): """根据输出格式返回正确的Pillow格式名称""" format_name = self.output_format.get().upper() if format_name in ["JPG", "JPEG"]: return "JPEG" elif format_name == "PNG": return "PNG" elif format_name == "BMP": return "BMP" elif format_name == "GIF": return "GIF" else: return "JPEG" def update_progress(self, quality): """更新进度条的值""" max_quality = 95 min_quality = 10 progress_value = ((max_quality - quality) / (max_quality - min_quality)) * 100 self.root.after(0, lambda: self.set_progress_value(min(progress_value, 100))) def set_progress_value(self, value): """设置进度条的值""" self.progress["value"] = value def show_message(self, title, message): """显示消息框并停止进度条""" self.root.after(0, lambda: messagebox.showinfo(title, message)) def sanitize_filename(filename): """清理文件名中的非法字符""" return re.sub(r'[\\/*?:"<>|]', "", filename) if __name__ == "__main__": root = tk.Tk() app = ImageCompressorApp(root) root.mainloop()

  • 新款模仿广告弹窗上班摸鱼工具

    新款模仿广告弹窗上班摸鱼工具

    更新:增加跳转 上一个 下一个 功能按键 在编辑框处粘贴目录地址,单击按钮,新增页数显示 ,输入页数(超出目录数字会运行错误),单击跳可直接跳转该页面,新增上一个下一个 按键。 内置浏览器等级较低 请在其他浏览器复制播放地址再粘贴到编辑框内访问

  • 车机搭建工程模式dns、开启adb小工具、哈弗三代H6、一代大狗、坦克300

    车机搭建工程模式dns、开启adb小工具、哈弗三代H6、一代大狗、坦克300

    本工具只在windows10系统上测试通过,因为使用PowerShell命令查找热点适配器,理论win10和win11都可以用 环境需要一个笔记本和一部手机使用教程:  1、笔记本连接手机热点,电脑开启热点 2、打开软件后会自动搜索电脑热点占用ip,一般都是192.168.137.1.如果不是可以手动输入到本机热点IP框中  3、依次点击更新IP、修改hosts文件 4、确认自己车机系统是华阳还是安波福,确认方式帮助里有  5、选择对应系统的工程模式的apk,也可以自定义文件  6、车机关闭流量功能,连接电脑热点,在车机界面找到"智能手册",成功的话会提示升级,点按升级,就成功安装工装模式了! 

1 2 3 4
赣ICP备2024051835号-2 | 赣公网安备36012102000813号
powered by Cn121
  • 首页
  • 复制图片URL
  • 复制
  • 刷新
  • 前进
  • 后退

  • 站内搜索
  • 百度搜索
sitemap