我正在try 制作失真效果,但如果我们使用命令行的"Convert"函数,它要求我们指定要转换的文件的路径,并在最后指定最终图像的名称.我想try 从bytesio或仅仅是bytesarray值生成输入图像

这是我的try ,但不幸的是它没有成功(,它说像错误的参数:-Liquid-Resale

# Distort function using imagemmagick
def distort(image, x=45, y=45):
    
    img = Image.open(BytesIO(image))
    w, h = img.size

    command = [
        "convert",
        "pipe:0",  # Input from stdin
        "-liquid-rescale", f"{x}x{y}%!",
        "-resize", f"{w}x{h}!",
        "pipe:1",  # Output to stdout
    ]

    try:
        process = subprocess.Popen(
            command,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )
        stdout, stderr = process.communicate(image)

        if process.returncode != 0:
            logger.info(f"ImageMagick error: {stderr.decode(encoding="latin-1")}")
            return None

        return stdout

    except Exception:
        import traceback
        traceback.print_exc()
        return None

推荐答案

你的问题可能需要更多的上下文来显示你的图像是什么样子(大小、格式等),以及你计划如何使用你的代码.如果我的答案不充分,请更新您的问题,我将try 更新我的答案以匹配.

问题似乎在于您为输入和输出使用的是ffmpeg样式的描述符(即pipe:0pipe:1),而不是ImageMagick所期望的,即破折号/下划线或fd数字.因此,要从stdin读取TIFF并创建JPEG,请使用:

cat image.tif | magick - result.jpg

或者,您可以使用:

cat image.tif | magick fd:0 result.jpg

或者,您可以使用:

cat image.tif | magick /dev/stdin result.jpg

请注意,最后一个选项可能在Windows上不起作用,而前两个可能会.


然而,这并不是故事的全部.您可能希望强制ImageMagickstdout上写入JPEG或PNG.您可以通过在输出文件中添加一个格式说明符来实现这一点--请注意,我重定向到一个文件,以避免在您的终端中造成混乱:

magick image.tif JPEG:-    > file.jpg

或者:

magick image.tif PNG:-     > file.png

请注意,您可以通过阅读My Answer here强制使用特定类型的PNG,例如8位、16位、调色板、RGBA.


具体地说,您的内部代码应该更像这样:

command = [
    "convert",
    "-",                             # Input from stdin
    "-liquid-rescale", f"{x}x{y}%!",
    "-resize", f"{w}x{h}!",
    "PNG:-",                         # Output PNG to stdout
]

还请注意,有通过wand直接到ImageMagick的Python绑定,因此您可以避免使用它的子进程的所有这种欺骗.

Python相关问答推荐

三个给定的坐标可以是矩形的点吗

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

如何删除索引过go 的lexsort深度可能会影响性能?' &>

什么相当于pytorch中的numpy累积ufunc

PyQt5,如何使每个对象的 colored颜色 不同?'

OR—Tools中CP—SAT求解器的IntVar设置值

导入...从...混乱

如何更新pandas DataFrame上列标题的de值?

在单次扫描中创建列表

搜索按钮不工作,Python tkinter

不允许 Select 北极滚动?

如何根据rame中的列值分别分组值

从嵌套极轴列的列表中删除元素

数据框,如果值在范围内,则获取范围和

裁剪数字.nd数组引发-ValueError:无法将空图像写入JPEG

如何为需要初始化的具体类实现依赖反转和接口分离?

TypeError:';Locator';对象无法在PlayWriter中使用.first()调用

PYTHON中的pd.wide_to_long比较慢

类型对象';敌人';没有属性';损害';

按最大属性值Django对对象进行排序