使用Python免费自制线稿生成工具

本文介绍了一个Python脚本,利用PIL和NumPy库将图片转换为线稿效果,通过命令行参数支持自定义输入和输出文件路径。脚本可通过pyinstaller编译为可执行文件方便使用。
摘要由CSDN通过智能技术生成

图片转线稿代码

这是一个Python脚本,它使用PIL库(Python Imaging Library,也被称为Pillow)和NumPy库将图片转换为线稿效果。以下是代码的具体内容:

# 文件名:ImgProcess.py

from PIL import Image
import numpy as np

def imgprocess(filename, out_puts="img_processed.jpg"):
    """
    将输入的图片转换为线稿效果,并保存为新的图片文件。

    参数:
        filename (str): 输入图片的文件路径。
        out_puts (str): 输出图片的文件路径,默认为 "img_processed.jpg"。

    返回:
        None
    """
    # 虚拟亮度,用于调整线稿的深浅
    depth = 10

    # 打开图片,并将其转换为灰度图
    a = np.array(Image.open(filename).convert('L'))

    # 计算图片的梯度,得到每个像素点在x和y方向上的变化率
    grad_x, grad_y = np.gradient(a)

    # 根据虚拟亮度调整梯度的大小
    grad_x = grad_x * depth / 100
    grad_y = grad_y * depth / 100

    # 光源效果,设定光源的方向
    vec_el = np.pi / 2
    vec_az = np.pi / 4.

    # 计算光源在x、y和z方向上的分量
    dx = np.cos(vec_el) * np.cos(vec_az)
    dy = np.cos(vec_el) * np.sin(vec_az)
    dz = np.sin(vec_el)

    # 计算每个像素点的单位向量
    A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    uni_x = grad_x / A
    uni_y = grad_y / A
    uni_z = 1. / A

    # 根据光源的方向和每个像素点的单位向量,计算每个像素点的亮度
    b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)

    # 将亮度值限制在0到255之间
    b = b.clip(0, 255)

    # 将处理后的图片数据转换为PIL图片对象,并保存为新的文件
    img = Image.fromarray(b.astype('uint8'))
    img.save(out_puts)

# 线稿示例
# 调用imgprocess函数,将'./static/bc.jpg'图片转换为线稿,并保存为'img_processed.jpg'
imgprocess(filename='./static/bc.jpg')

使用这段代码,你可以将任何输入的图片转换为线稿效果,并保存为新的图片文件。

以下是将其转换为可执行脚本:
为了将上述脚本转换为一个可以接受--image_path命令行参数的可执行文件,需要进行几个步骤:

  1. 使用argparse模块来解析命令行参数。
  2. imgprocess函数内部的硬编码文件路径替换为从命令行参数中获取的路径。
  3. 编写一个主函数main来调用imgprocess函数,并处理命令行参数。
  4. 在脚本的末尾添加if __name__ == "__main__":块来调用main函数。

下面是修改后的脚本:

# 文件名:img_to_lineart.py

from PIL import Image
import numpy as np
import argparse

def imgprocess(image_path, out_puts="img_processed.jpg"):
    """
    将输入的图片转换为线稿效果,并保存为新的图片文件。

    参数:
        image_path (str): 输入图片的文件路径。
        out_puts (str): 输出图片的文件路径,默认为 "img_processed.jpg"。

    返回:
        None
    """
    # 虚拟亮度,用于调整线稿的深浅
    depth = 10

    # 打开图片,并将其转换为灰度图
    a = np.array(Image.open(image_path).convert('L'))

    # 计算图片的梯度
    grad_x, grad_y = np.gradient(a)

    # 根据虚拟亮度调整梯度的大小
    grad_x = grad_x * depth / 100
    grad_y = grad_y * depth / 100

    # 光源效果,设定光源的方向
    vec_el = np.pi / 2
    vec_az = np.pi / 4.

    # 计算光源在x、y和z方向上的分量
    dx = np.cos(vec_el) * np.cos(vec_az)
    dy = np.cos(vec_el) * np.sin(vec_az)
    dz = np.sin(vec_el)

    # 计算每个像素点的单位向量
    A = np.sqrt(grad_x ** 2 + grad_y ** 2 + 1.)
    uni_x = grad_x / A
    uni_y = grad_y / A
    uni_z = 1. / A

    # 根据光源的方向和每个像素点的单位向量,计算每个像素点的亮度
    b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)

    # 将亮度值限制在0到255之间
    b = b.clip(0, 255)

    # 将处理后的图片数据转换为PIL图片对象,并保存为新的文件
    img = Image.fromarray(b.astype('uint8'))
    img.save(out_puts)

def main():
    parser = argparse.ArgumentParser(description='Convert an image to lineart.')
    parser.add_argument('--image_path', type=str, required=True, help='Path to the input image file.')
    parser.add_argument('--output_path', type=str, default="img_processed.jpg", help='Path to save the processed image file.')
    args = parser.parse_args()

    imgprocess(args.image_path, args.output_path)

if __name__ == "__main__":
    main()

接下来,为了将这个Python脚本转换为可执行文件,你需要做以下事情:

  1. 确保你的Python环境已经安装了所有必需的包(Pillow 和 argparse)。
  2. 将上述脚本保存为 img_to_lineart.py
  3. 在命令行中,使用以下命令将脚本转换为可执行文件(假设你已经安装了 pyinstaller):
pyinstaller --onefile img_to_lineart.py

这将会创建一个单独的可执行文件(在Windows上是.exe,在Linux或macOS上是没有扩展名的文件)。

  1. 运行可执行文件,并传入--image_path参数:
./img_to_lineart --image_path /path/to/your/image.jpg

或者,在Windows上:

img_to_lineart.exe --image_path C:\path\to\your\image.jpg

这样,你就可以通过命令行参数来指定输入图片的路径,并运行脚本将其转换为线稿效果了。

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值