使用批处理脚本(ImageMagick)获取图像尺寸

3
我想要做的是使用ImageMagick在一张图片上创建边框。这是一个简单的过程,我可以手动输入硬编码值来完成,但我希望它变得更加智能化。它需要做的就是简单地定义您想要边框的图像,然后脚本将运行,获取图像的尺寸,然后将我拥有的边框图像调整到那些尺寸,并将边框贴在顶部。
为了做到这一点,根据我的基本理解,我将不得不将图像的宽度和高度存储为变量。我已经接近实现目标(获取信息):
identify "image.png"

这段代码可以输出我需要的信息,但是我需要将宽度/高度存储到变量中以便在后续处理中使用。

我从https://superuser.com/questions/323970/how-can-i-get-the-image-dimensions-of-a-targa-file-through-a-batch-script找到了以下代码。

(注意:我的.bat文件名为“imagecheck.bat”)

identify -format "imagecheck2.bat %w %h" image.png > temp.bat
temp.bat

根据那段代码的作者所说,它将从image.png获取宽度和高度(%w和%h),然后将其存储在imagecheck2.bat中作为变量,我可以通过%1(代表%w)和%2(代表%h)访问。

因此,在imagecheck2.bat中,我写了以下内容:

@echo off
echo The parameters were: %1 and %2
pause

而且它会打印出来

The parameters were:  and 

这应该是一件很简单的事情;您有什么想法我错过了什么吗? 提前感谢。


你为什么有两个 imagecheck 批处理文件?你不能只去掉 > temp.bat 并在调用命令时立即输出吗? - unclemeat
上面的代码只是从链接中提取出来的,然后我稍微修改了一下,使其更符合我的需求。但是在ImageMagick命令完成后,我无法获取输出结果。 - user2368229
https://dev59.com/W3I_5IYBdhLWcg3wBub4 - Ciro Santilli OurBigBook.com
2个回答

13

以下是一种可以在不使用任何辅助文件的情况下完成的方法。

for /f "tokens=1-2" %%i in ('identify -ping -format "%%w %%h" logo:') do set W=%%i & set H=%%j
echo width: %W%
echo height: %H%

用您的图像文件名替换“logo:”。

话虽如此,我强烈建议不要使用MS Batch,因为程序越复杂,代码就会变得更加荒谬。

顺便说一句,在那个identify命令中使用-ping标志可以大大加快操作,因为它告诉identify不要将整个图像加载到内存中,只需加载足够的图像以确定其尺寸即可。


你真是个天才!太感谢了,伙计。此外,我使用批处理的唯一原因是最终所有这些都将由PHP操作,并且1)对我来说,编写这些批处理更容易2)据我所知,通过运行批处理文件进行一个system()调用比为ImageMagick的每个命令运行一个system()调用要快得多。此外,由于PHP的字符串限制,我无法通过PHP的system()使分层/遮罩工作,但是通过批处理文件中的命令可以正常工作。 - user2368229
2
啊,既然这样,我建议先放弃批处理,然后再放弃PHP;-) 感谢您的支持。 - retroj
如果不是为了工作,我很乐意放弃 PHP。 - user2368229
“-ping” 这个建议今天仍然适用吗?我是 ImageMagick 的新手,在 文档 中找不到它(至少在那里没有)。 - watery
@watery 这里有文档:https://imagemagick.org/script/command-line-options.php#ping - Robin A. Meade

2

无需使用ImageMagick,你可以直接从PNG中提取宽度和高度。它们位于已知位置,并且每个都是以网络字节顺序(最高有效字节在前)的4字节整数表示。从文件开头的偏移量分别为

 signature:   bytes 0-7
 IHDR length: bytes 8-11
 "IHDR":      bytes 12-15
 width:       bytes 16-19
 height:      bytes 20-23

每种不同的文件类型的顺序都不一样,对吧? PNG是主要的文件类型,但未来很有可能会出现位图、JPEG和Targa文件(不幸的是)。 - user2368229
这个答案是针对PNG的,因为你的问题似乎是关于PNG的。对于各种类型的图像,“identify”将会找到尺寸,就像retroj的答案中所描述的那样。 - Glenn Randers-Pehrson
它确实做了我要求的事情,那是我的错;但仍然非常有用。谢谢 :) - user2368229

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接