python纯终端实现图片查看器(全彩)(windows)

news2025/4/1 6:53:45

很多人作为命令行爱好者,无法在终端内直接查看图片是无法忍受的,

那就写一个!

先直接上代码

import os
import sys
from PIL import Image
import numpy as np
import colorama
import msvcrt  # Windows专用

# 初始化colorama
colorama.init()

# 更丰富的字符梯度,用于更好的放大效果

chars = [" ", "░", "▒", "▓", "█", "▀", "▄", "▌", "▐", "■", "◢", "◣", "◤", "◥", "◧", "◨", "◩", "◪", "◫"]

def clear_screen():
    """清屏"""
    os.system('cls' if os.name == 'nt' else 'clear')

def image_to_ansiart(image_path, width=80, scale=1.0):
    """将图片转换为ANSI彩色字符画,支持平滑缩放"""
    try:
        img = Image.open(image_path)
    except Exception as e:
        return f"[无法加载图片: {str(e)}]"
    
    # 应用缩放因子
    width = int(width * scale)
    aspect_ratio = img.height / img.width
    height = int(width * aspect_ratio * 0.45)  # 调整高宽比以获得更好显示效果
    
    # 确保最小尺寸
    width = max(10, width)  # 最小宽度设为10
    height = max(5, height)  # 最小高度设为5
    
    # 使用高质量缩放
    img = img.resize((width, height), Image.Resampling.LANCZOS)
    img = img.convert("RGB")
    pixels = np.array(img)
    
    ansi_lines = []
    for row in pixels:
        line = []
        for pixel in row:
            r, g, b = pixel
            brightness = 0.299 * r + 0.587 * g + 0.114 * b
            
            # 选择字符,使用更精细的亮度分级
            char_idx = int(brightness / 255 * (len(chars) - 1))
            char = chars[char_idx]
            
            # 使用24位真彩色
            line.append(f"\x1b[38;2;{r};{g};{b}m{char}")
        ansi_lines.append("".join(line) + "\x1b[0m")
    
    return "\n".join(ansi_lines)

def get_terminal_size():
    """获取终端大小"""
    try:
        from shutil import get_terminal_size as gts
        return gts().columns, gts().lines
    except:
        return 80, 24  # 默认值

def get_image_list(start_image=None):
    """获取当前目录图片列表,并定位到指定图片"""
    images = sorted([f for f in os.listdir() 
                   if f.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.webp'))])
    
    if not images:
        print("当前目录没有图片文件(支持.png/.jpg/.jpeg/.bmp/.gif/.webp)")
        return None, -1
    
    # 如果指定了初始图片,尝试定位
    idx = 0
    if start_image:
        start_image = os.path.basename(start_image)  # 只取文件名部分
        try:
            idx = images.index(start_image)
        except ValueError:
            # 如果文件不在当前目录,添加到列表并设为当前图片
            if os.path.exists(start_image):
                images.append(start_image)
                images.sort()
                idx = images.index(start_image)
            else:
                print(f"警告: 指定的图片文件 {start_image} 不存在")
    
    return images, idx

def main():
    # 处理命令行参数
    start_image = sys.argv[1] if len(sys.argv) > 1 else None
    
    # 获取图片列表和初始索引
    images, idx = get_image_list(start_image)
    if not images:
        return
    
    scale = 1.0
    base_width = min(80, get_terminal_size()[0] - 10)  # 根据终端宽度调整
    
    while True:
        clear_screen()
        
        # 显示图片信息和控制说明
        print(f"图片查看器: {images[idx]} ({idx+1}/{len(images)}) 缩放: {scale:.1f}x")
        print("← →:切换图片 | + -:缩放(0.2x-5.0x) | Home/End:首图/末图 | Q:退出")
        print("-" * min(80, get_terminal_size()[0]))
        
        try:
            # 显示图片
            art = image_to_ansiart(images[idx], base_width, scale)
            print(art)
        except Exception as e:
            print(f"渲染错误: {str(e)}")
        
        # 获取按键
        key = msvcrt.getch()
        try:
            key = key.decode('utf-8').lower()
        except:
            key = str(key)
        
        # 处理按键
        if key == 'q':
            break
        elif key == '+' and scale < 5.0:
            scale = min(5.0, scale + 0.1)  # 更精细的缩放控制
        elif key == '-' and scale > 0.2:
            scale = max(0.2, scale - 0.1)
        elif key == '\x00' or key == '\xe0':  # 功能键前缀
            next_key = msvcrt.getch()
            if next_key == b'M' or next_key == b'P':  # 右箭头或下箭头
                idx = (idx + 1) % len(images)
                scale = 1.0
            elif next_key == b'K' or next_key == b'H':  # 左箭头或上箭头
                idx = (idx - 1) % len(images)
                scale = 1.0
            elif next_key == b'G':  # Home键
                idx = 0
                scale = 1.0
            elif next_key == b'O':  # End键
                idx = len(images) - 1
                scale = 1.0
        elif key == '\r':  # 回车键重置缩放
            scale = 1.0
        elif key == 'f':  # 切换全屏/正常模式
            base_width = get_terminal_size()[0] - 10 if base_width < 100 else 80

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        pass
    except Exception as e:
        print(f"程序出错: {str(e)}")
    finally:
        # 重置终端
        print("\x1b[0m")  # 重置所有属性
        colorama.deinit()

运行:

python viewer.py myphoto.jpg

直接

python viewer.py

也可以 

 效果图:

 -和+可以放大缩小

(提示:windows终端 ctrl + 放大字体,ctrl - 缩小字体,缩小字体效果更佳)

 

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

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

相关文章

【动态规划篇】- 路径问题

62. 不同路径 题目链接&#xff1a; 62. 不同路径 题目解析&#xff1a; 状态表示 dp[i][j]表示&#xff1a;以[i][j]为终点时&#xff0c;一共有多少种路径。 状态转移方程 以[i][j]最近的几步来分析问题&#xff0c;要么从[i-1][j]位置向下走一步到达[i][j],要么从[i][j-1…

《新凯来:半导体设备制造领域的“国家队”》

《新凯来&#xff1a;半导体设备制造领域的“国家队”》 一、SEMICON China 爆火出圈&#xff1a;31 款设备背后的 “深圳力量” 1.1 展会现象级热度 在 2025 年 SEMICON China 展会现场&#xff0c;新凯来展台成了整届展会当之无愧的 “顶流”&#xff0c;被来自全球各地的专…

AI大模型最新发布[update@202503]

OpenAI GPT-4o&#xff1a;多模态&#xff0c;“o”代表Omni&#xff0c;即全能的意思&#xff0c;凸显了其多功能的特性。 多模态交互&#xff0c;GPT-4o可以接受文本、音频和图像的任意组合作为输入&#xff0c;并生成文本、音频和图像的任意组合输出。实时推理能力&#x…

深入浅出 Embedding

1. 什么是 Embedding? Embedding(嵌入)是一种将高维数据映射到低维连续空间的技术,用于表达数据的语义关系。简单来说,它是一种向量化表示,将文本、图像、用户行为等信息转换为数值向量,使得相似的数据在向量空间中距离更近。 2. 如何理解 Embedding? 2.1 浅显易懂的…

java项目之基于ssm的乡镇自来水收费系统(源码+文档)

项目简介 乡镇自来水收费系统实现了以下功能&#xff1a; 乡镇自来水收费系统在Eclipse环境中&#xff0c;使用Java语言进行编码&#xff0c;使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务&#xff0c;其管理员管理水表&#xff0c;审核用户更换…

Spring AI MCP 架构详解

Spring AI MCP 架构详解 1.什么是MCP? MCP 是一种开放协议&#xff0c;它对应用程序向大语言模型&#xff08;LLMs&#xff09;提供上下文信息的方式进行了标准化。可以把 MCP 想象成人工智能应用程序的 USB-C 接口。就像 USB-C 为将设备连接到各种外围设备和配件提供了一种…

目标识别与双目测距(1)环境搭建:Ubuntu+yolov5+pcl库

环境情况 ubuntu 18.04 → 20.04&#xff08;最终&#xff09; 安装Ubuntu1804虚拟机系统 Anaconda&#xff1a;可参考我的另一篇文章 Python 3.6.13 → 3.8&#xff08;最终&#xff09;Anaconda3-2021.05 目标识别&#xff1a;YOLOv5相关 1、安装git sudo apt install gi…

OpenAI API - Agent

文章目录 代理概述模型工具知识与记忆防护栏编排入门 语音代理选择正确的架构语音到语音&#xff08;多模态&#xff09;架构链式架构 构建语音代理使用语音到语音架构进行实时处理将音频输入链接到文本处理 → 音频输出 代理 了解如何使用 OpenAI API 构建代理。 https://pl…

Strawberry perl的下载,查询版本号,配置Path环境变量,查找perl解释器的位置

Strawberry Perl 是一个适用于 Microsoft Windows 的 Perl 环境&#xff0c;包含运行和开发 Perl 应用程序所需的一切。它旨在尽可能接近 UNIX 系统上的 Perl 环境。 下载 官网: Strawberry Perl for Windows - Releases 各个版本: Strawberry Perl for Windows - Releases …

MySQL的基础语法2(函数-字符串函数、数值函数、日期函数和流程函数 )

目录 一、字符串函数 1.常见字符串函数 ​编辑 2.字符串函数的基本使用 3.字符串函数的数据库案例演示 二、数值函数 1.常见数值函数&#xff08;如下&#xff09;&#xff1a; 2.数值函数的基本使用 3.数值函数的数据库案例演示 三、日期函数 1.常见的日期函数 2.日…

5G_WiFi_CE_杂散测试

目录 一、规范要求 1、法规目录&#xff1a; 2、限值&#xff1a; &#xff08;1&#xff09;带外发射杂散 &#xff08;2&#xff09;带内发射杂散 &#xff08;3&#xff09;接收杂散 二、测试方法 1、带外发射杂散 &#xff08;1&#xff09;测试条件 &#xff08…

大数据Spark(五十五):Spark框架及特点

文章目录 Spark框架及特点 一、Spark框架介绍 二、Spark计算框架具备以下特点 Spark框架及特点 一、Spark框架介绍 Apache Spark 是一个专为大规模数据处理而设计的快速、通用的计算引擎。最初由加州大学伯克利分校的 AMP 实验室&#xff08;Algorithms, Machines, and Pe…

UI产品经理基础(六):如何解决用户的质疑?

在需求调查中遇到用户质疑“不专业”或“不了解需求”&#xff0c;本质上是用户对产品经理的信任缺失或沟通鸿沟导致的。要化解这种质疑&#xff0c;需从专业能力展示、沟通方式优化、用户参与感提升三个维度切入&#xff0c;结合具体场景采取针对性策略。以下是系统化的解决方…

【大数据技术】大数据技术概念及概述

1. 大数据概念 数据 是实时或观察的结果是对客观事务的逻辑归纳是用于表示客观事物的未经加工的原始素材 数据的产生 对客观事务的计量和记录尝试的数据 单位换算1 byte8 bit1 k1024 byte1 mb1024 k1 g1024 m1 t1024 g1 p1024 t1 e1024 p1 z1024 e1 y1024 z1 b1024 y1 n10…

Python库()

1.概念 Matplotlib 库&#xff1a;是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行&#xff0c;它能够根据 NumPy ndarray 数组来绘制 2D 图像&#xff0c;它使用简单、代码清晰易懂 Matplotlib 图形组成&#xff1a; Figure&#xff1a;指整个图形&#xf…

AI知识补全(八):多模态大模型是什么?

名人说&#xff1a;人生如逆旅&#xff0c;我亦是行人。 ——苏轼《临江仙送钱穆父》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;AI知识补全&#xff08;七&#xff09;&#xff1a;AI Agent 智能…

Docker-MySQL安装-命令解读-常见命令-数据卷挂载-本地目录挂载-自定义镜像-网络-前端部署-DockerCompose

目录 Docker&#xff1a; 安装MySQL&#xff1a; 镜像容器&#xff1a; 镜像仓库&#xff1a; ​编辑命令解读&#xff1a; 镜像命名规范&#xff1a; docker run中常见参数&#xff1a; Docker常见命令&#xff1a; ​编辑数据卷&#xff1a; ​编辑数据卷-操作命令&…

Docker 安装部署Harbor 私有仓库

Docker 安装部署Harbor 私有仓库 系统环境:redhat x86_64 一、首先部署docker 环境 定制软件源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repoyum install -y yum-utils device-mapper-persistent-data lvm2…

StarRocks 存算分离在京东物流的落地实践

康琪&#xff1a;京东物流高级技术专家、StarRocks & Apache Flink Contributor 导读&#xff1a;本文整理自京东物流高级技术专家在 StarRocks 年度峰会上的分享&#xff0c;UData 平台从存算一体到存算分离架构演进后&#xff0c;查询性能得到提升。Cache hit 时&#xf…