使用 Imagemagick 一次将图像与不透明度贴图批量合并 [已关闭]

Batch combine images with Opacity map at a time with Imagemagick [closed]

提问人:snipers500 提问时间:10/7/2023 最后编辑:snipers500 更新时间:10/8/2023 访问量:67

问:


我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便用事实和引文来回答。

上个月关闭。

我有一个目录,里面装满了 *_Alb.png 和 *_Opa.png 形式的图像,其中 Opa 文件是 Alb 图像的黑白“不透明度贴图”。我想将不透明度贴图转换为反照率图像的 alpha 通道,这个文件夹中大约有 100 个,我想将其发送到另一个文件夹的输出。

我能够使用以下方法对单个图像执行此操作:

magick [filename]_Alb.png [filename]_Opa.png -compose CopyOpacity -composite done/[filename].png

但是我所做的任何尝试都无法为多个图像自动执行此操作。这是我目前使用批处理文件的尝试:

@echo off 
setlocal enableextensions enabledelayedexpansion
set file=before 
for /R [folder path] %%a in (./*Alb.png) do (
    set "file=%%a"
       magick !file:~34,0! !file:~34,-8!_Opa.png -alpha Off -compose CopyOpacity -composite output/!file:~34,-8!.png
)

它为每一行提供以下输出:

magick: image sequence is required `-composite' @ error/operation.c/CLIListOperatorImages/4057.
图像 批处理文件 ImageMagick Transparency Alpha

评论

1赞 Mark Setchell 10/7/2023
当每个输入文件需要不同的 alpha 文件时,您将无法使用 - 其语法不允许这样做。因此,如果您坚持使用 Windows,则需要使用笨拙的旧批处理文件方法或 Powershell 或 Python。如果您尝试过一些批处理文件方法,请单击“编辑”并将其添加到您的问题中。您应该能够使用 a 遍历您的反照率文件,然后计算每个文件的 alpha 好友的名称和相应的输出文件。mogrifyFOR F IN *_Alb.png
0赞 snipers500 10/7/2023
是的,这就是我尝试过的。我已经编辑了这篇文章以添加我所做的尝试批处理文件。我对批处理文件的经验很少,所以这就是我通过几个小时的反复试验和谷歌搜索所能做的。
0赞 snipers500 10/7/2023
哦,我的上帝,出于某种该死的原因,将“!file:~34,0!”更改为“”!file:~34,-8!_Alb.png“使它起作用,尽管它应该是一样的???
0赞 SomethingDark 10/8/2023
!file:~34,0!表示“从第 34 个字符开始,取 0 个字符”。它将始终返回一个空字符串。如果你想从第 34 个字符开始并抓住字符串的其余部分,那只是!file:~34!

答:

1赞 snipers500 10/8/2023 #1

我自己设法弄清楚了

@echo off 
setlocal enableextensions enabledelayedexpansion
set file=before 
for /R [file path] %%a in (./*Alb.png) do (
    set "file=%%a"
    magick !file:~34,-8!_Alb.png ^
  ( +clone -alpha extract !file:~34,-8!_Opa.png -compose Multiply -composite ^) ^
  -compose CopyOpacity -composite ^
  output/!file:~34,-8!.png
)

我得到的错误是通过更改为尽管其中两个应该具有相同的输出来修复的。我不确定这是如何工作的,如果有人想详细说明为什么它会受到赞赏,我的理论是有一些角色魔法师不知道如何处理最后。!file:~34,0!!file:~34,-8!_Alb.png

原始反照率文件有自己的透明度,因此为了将它们组合起来而不是丢弃它,我能够在网上找到该行。如果原始反照率文件没有任何透明度,则不需要它,并且可以按照我在第一篇文章中的方式完成。+clone

评论

0赞 Mark Setchell 10/8/2023
很酷,干得好!感谢您与 StackOverflow 社区的分享。
1赞 Compo 10/8/2023 #2

根据您的问题详细信息,似乎没有理由使用递归命令。因此,我可能会提出另一种想法。

@Echo Off
SetLocal EnableExtensions DisableDelayedExpansion

Set "SourceDir=S:\ource Dir"
Set "MagickExe=P:\ath To\magick.exe"

PushD "%SourceDir%" 2>NUL || GoTo :EOF
If Not Exist "%MagickExe%" GoTo :EOF

For /F "Delims=" %%G In ('"(Set PATHEXT=) & %SystemRoot%\System32\where.exe .:"*_Alb.png" 2>NUL"') Do (
    Set "BaseName=%%~nG"
    SetLocal EnableDelayedExpansion
    If Exist "!BaseName:~,-3!Opa%%~xG" (If Not Exist "done\." MD "done"
        "%MagickExe%" "%%G" "!BaseName:~,-3!Opa%%~xG" -compose CopyOpacity -composite "done\!BaseName:~,-4!%%~xG"
    )
    EndLocal
)

PopD

Endlocal
GoTo :EOF