python:实现通过字符串将图片画出来

简单介绍:
  • 项目需求:
    • 将传入的图片使用字符串保存并展示。
  • 项目思想和逻辑:
    • 代码中很容易看明白
  • 关键环境:
    • python 3.65 Pillow 7.0.0
  • 命令行测试:
    • python pic.py -i ./obj_fie/file.png
  • github:
code
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# Author  : rusi_

import os
import argparse

from PIL import Image

# 参数flag
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input', help="请输入要转换的图片文件路径,通过参数-i 或者 -input:")
parser.add_argument('-o', '--output', help="请输入字符画的路径,参数为-o 或者 -output:")
parser.add_argument('-w', '--width', type=int, default=80, help="可通过-w或者--width指定输出字符画的宽度,默认为80")
parser.add_argument('-hi', '--height', type=int, default=80, help="可通过-hi或者--height指定输出字符画的高度,默认为80")

# 获取参数
args = parser.parse_args()
IMG = args.input
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output


class TxTDraw(object):
    """
    项目原理:
    1、将所有像素都转换为字符
    2、为了保证所有像素转换为字符,所以要将图片由三通道转换为单通道。
    """

    def __init__(self):
        # 用于映射的字符集
        self.STR_MAP = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")

    def get_char(self, r, g, b, alpha=256):
        """
        将256灰度映射到70个字符上
        :param r: r通道
        :param g: g通道
        :param b: b通道
        :param alpha: 标记透明度的alpha通道
        :return: 要写在文本中的字符
        """
        if alpha == 0:  # 透明的
            return ' '
        # 灰度值公式将像素的 RGB 值映射到灰度值,灰度值范围为 0-255。
        # 整型慢计算比浮点数块(其数值代表权重值,意为人眼对rgb的敏感强度)
        # gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
        gray = int(2126 * r + 7152 * g + 722 * b) / 10000

        # 字符集只有,70的映射操作。
        tmp_gray = 255 + 1  # 灰度值范围为 0-255即最大为255,又因为int的退一法操作,所以再加1.
        unit = tmp_gray / len(self.STR_MAP)
        return self.STR_MAP[int(gray / unit)]

    def draw_pic(self):
        """
        将字符画画出
        :return:字符画字符串
        """
        img = Image.open(IMG)
        img = img.resize((WIDTH, HEIGHT), Image.ANTIALIAS)

        txt = ""

        for i in range(HEIGHT):
            for j in range(WIDTH):
                txt += self.get_char(*img.getpixel((j, i)))
            # 一行画完,加个换行符。
            txt += '\n'
        return txt

    def write_output(self):
        """
        将字符画字符串写入文件
        :return:字符画字符串
        """
        txt = self.draw_pic()
        # 用于输出文件的默认命名
        txt_name = os.path.basename(IMG)
        # 如果OUTPUT有值就用OUTPUT,没有就用txt_name.replace('.', '')+'.txt'。
        with open(f"./obj_fie/{OUTPUT or txt_name.replace('.', '')+'.txt'}", 'w') as f:
            f.write(txt)
        return txt


if __name__ == '__main__':
    obj = TxTDraw()
    print(obj.write_output())

# im.getpixel()以元祖的形式返回32位4通道对应的数值。
# im.resize()重设图片大小,Image.ANTIALIAS :图片质量(此处为最高质量)

项目展示项目展示
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生成验证码图片的一般流程如下: 1. 生成验证码字符串,可以是数字、字母或其组合。 2. 创建一张空白的图片,设置大小和背景色。 3. 在图片上绘制验证码字符串,可以使用不同的字体、大小、颜色、旋转等方式。 4. 对验证码字符串进行干扰处理,比如添加噪点、扭曲变形等,以增强安全性。 5. 最后输出图片。 以下是一个使用 Pillow 库生成简单验证码图片的示例代码: ```python from PIL import Image, ImageDraw, ImageFont import random # 生成随机验证码字符串 def generate_code(length=4): chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' code = '' for i in range(length): code += random.choice(chars) return code # 创建验证码图片 def create_image(code, size=(120, 30), font_size=25): # 创建空白图片 image = Image.new('RGB', size, (255, 255, 255)) # 创建笔 draw = ImageDraw.Draw(image) # 加载字体 font = ImageFont.truetype('arial.ttf', font_size) # 绘制验证码字符串 draw.text((10, 5), code, font=font, fill=(0, 0, 0)) # 添加干扰点 for i in range(random.randint(100, 150)): x = random.randint(0, size[0]) y = random.randint(0, size[1]) draw.point((x, y), fill=(0, 0, 0)) # 添加干扰线 for i in range(random.randint(2, 3)): x1 = random.randint(0, size[0]) y1 = random.randint(0, size[1]) x2 = random.randint(0, size[0]) y2 = random.randint(0, size[1]) draw.line((x1, y1, x2, y2), fill=(0, 0, 0)) # 返回验证码图片 return image # 测试代码 code = generate_code() image = create_image(code) image.show() ``` 注意,上述示例仅是一个简单的实现,实际应用中还需要考虑更多的安全性问题,比如防止机器自动识别验证码等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值