[ Unix 源码安装 | Windows 源码安装 ]
首先检查一下电脑里已经安装的ImageMagick版本,输入:
convert -version
除非你想要把对另外的图像格式的支持或升级一个较新的版本,否则你可能不需要ImageMagick的源码安装。 你也可以安装预先编译二进位版本。然而,如果你仍然想要从源码安装,请选择一个平台,Unix 或 Windows。
在源码安装之前,你可能要回顾ImageMagick的最近变化。
Unix 源码安装
ImageMagick 在多种操作系统 Unix 和包括 Linux,Solaris,FreeBSD,Mac 操作系统 X 和其它的类 Unix 一样的操作系统上建立。 它需要一个编译器,几乎所有现代的 Unix 系统都会有一个。 可以从 ftp.imagemagick.org 或它的镜像网站下载 ImageMagick.tar.gz 并用这个指令解压缩:
gunzip -c ImageMagick.tar.gz | tar xvf -
然后配置编译ImageMagick:
cd ImageMagick-6.?.?
./configure
make
如果配置编译的ImageMagick没有出现错误,要把它安装到系统里,你需要使用管理员权限,输入:
make install
最后,可以测试一下ImageMagick的工作效果:
/usr/local/bin/convert logo: logo.gif
恭喜你,你已经有ImageMagick的工作环境了,你可以使用ImageMagick加入新图片,生成缩略图,组合图片……
还可以使用其它程序接口 C, C++, Perl, 和其它程序。
上述的指导将会使很多的 ImageMagick 使用者满意,但是我们怀疑一些将会有另外的问题或问题考虑。
如果 ImageMagick 无法配置或编译,或如果你没有管理员权限或没有将ImageMagick安装到默认目录
请点这里了解更多……
Windows 源码安装
Windows系统下ImageMagick源码安装需要Microsoft Visual Studio IDE。
有的用户也成功的用Borland C++编译。如果你没有编译器,你可以安装二进位发布版本
从ftp.imagemagick.org或它的镜像网站下载 ImageMagick-windows.zip 文件,然后用 WinZip 解压缩。
然后运行你的Visual Studio IDE选择Open->Project从ImageMagick-6.?.?/VisualMagick/configure文件夹里选择configure.dsp文件 Build->Build编译并执行。
可以通过以下方法获取图片信息
安装ImageMagick便携版本
调用命令行程序并获取返回信息
CString ExeCmd(CString pszCmd)
{
//创建匿名管道
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
HANDLE hRead, hWrite;
if (!CreatePipe(&hRead, &hWrite, &sa, 0))
{
return _T("");
}
//设置命令行进程启动信息(以隐藏方式启动命令并定位其输出到hWrite)
STARTUPINFO si = {sizeof(STARTUPINFO)};
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdError = hWrite;
si.hStdOutput = hWrite;
//启动命令行
PROCESS_INFORMATION pi;
if (!CreateProcess(NULL, (LPWSTR)(LPCWSTR)pszCmd, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
{
return _T("");
}
//立即关闭hWrite
CloseHandle(hWrite);
//读取命令行返回值
char buff[1024] = {0};
DWORD dwRead = 0;
while (ReadFile(hRead, buff, 1024, &dwRead, NULL))
{
}
CString strRet(buff);
CloseHandle(hRead);
return strRet;
}
使用:
ExeCmd(_T("ping baidu.com"));
ExeCmd(_T("identify -format "%[colorspace]" E:\\P70306-163226.jpg"));
安装ImageMagickCOM+对象
C++程序员应该看一下MagickCMD.cpp命令行实用工具的示例调用该对象的C++。对象变量列表的大小需要BSTR的模仿命令行argc,argv风格的COM组件的调用约定,这是更复杂的C++中然后在VB或VBS。
#include <iostream>
#include <atlbase.h>
#include <atlsafe.h>
#import "ImageMagickObject.tlb" no_namespace
using namespace std;
typedef enum
{
cmdUnknown,
cmdCompare,
cmdComposite,
cmdConvert,
cmdIdentify,
cmdMogrify,
cmdMontage,
cmdStream
} CommandType;
static struct
Commands
{
char
*name;
CommandType
code;
} Commands[] =
{
{ "", cmdUnknown },
{ "compare", cmdCompare },
{ "composite", cmdComposite },
{ "convert", cmdConvert },
{ "identify", cmdIdentify },
{ "mogrify", cmdMogrify },
{ "montage", cmdMontage },
{ "stream", cmdStream }
};
int main(int argc, char* argv[])
{
int
index,
status = 0;
char
*name;
CommandType
code = cmdUnknown;
// We must have at least a command, input, and output
if (argc < 4)
return 0;
index = 1;
while ((name = Commands[index].name))
{
if (stricmp(name,argv[1]) == 0)
{
code = Commands[index].code;
break;
}
index++;
}
if (code == cmdUnknown)
return 0;
CoInitialize(NULL);
try
{
CComVariant
result;
SAFEARRAY
**ppsa = (SAFEARRAY**) NULL;
IMagickImagePtr pImageProc(__uuidof(MagickImage));
if (pImageProc == NULL)
status = 1;
else
{
{
// Define the array bound structure
CComSafeArrayBound bound[1];
bound[0].SetCount(argc-2);
bound[0].SetLowerBound(0);
CComSafeArray<VARIANT> args(bound);
if( !args )
status = 2;
else
{
for(index = 2; index < argc; ++index)
{
CComVariant vt(argv[index]);
HRESULT hr = vt.Detach(&args[index-2]);
}
switch(code)
{
case cmdCompare:
result = pImageProc->Compare(args.GetSafeArrayPtr());
break;
case cmdComposite:
result = pImageProc->Composite(args.GetSafeArrayPtr());
break;
case cmdConvert:
result = pImageProc->Convert(args.GetSafeArrayPtr());
break;
case cmdIdentify:
result = pImageProc->Identify(args.GetSafeArrayPtr());
break;
case cmdMogrify:
result = pImageProc->Mogrify(args.GetSafeArrayPtr());
break;
case cmdMontage:
result = pImageProc->Montage(args.GetSafeArrayPtr());
break;
case cmdStream:
result = pImageProc->Stream(args.GetSafeArrayPtr());
break;
}
pImageProc.Release();
}
}
}
}
catch(_com_error ex)
{
HRESULT
res = ex.Error();
_bstr_t
desc = ex.Description();
printf("Error %s (0x%08x)\n",(char *)desc,res);
status = 4;
}
CoUninitialize();
return status;
}
Magick ++ API
Magick ++为标准模板库(STL)提供集成支持,以便可以使用强大的可用容器(例如deque, vector,list和map)来编写与PERL和PerlMagick类似的程序。提供了与ImageMagick的列表样式操作的STL兼容模板版本,以便可以对存储在STL容器中的多个图像执行操作。
Magick ++作为ImageMagick 源代码的一部分包含在内,可以通过HTTP 或GitHub进行检索。
它读取图像,裁剪图像,并以PNG图像格式将其写入磁盘:
#include <Magick++.h>
#include <iostream>
using namespace std;
using namespace Magick;
int main(int argc,char **argv)
{
InitializeMagick(*argv);
// Construct the image object. Seperating image construction from the
// the read operation ensures that a failure to read the image file
// doesn't render the image object useless.
Image image;
try {
// Read a file into image object
image.read( "logo:" );
// Crop the image to specified size (width, height, xOffset, yOffset)
image.crop( Geometry(100,100, 100, 100) );
// Write the image to a file
image.write( "logo.png" );
}
catch( Exception &error_ )
{
cout << "Caught exception: " << error_.what() << endl;
return 1;
}
return 0;
}
ImageMagick其他文章
ImageMagick 入门:使用命令行来编辑图片
ImageMagick 不仅仅是一个图像查看器,它还提供了大量的图像编辑工具和选项。
如何在 ImageMagick 中使用 display 命令和其他命令行工具。
display 命令
假设你有一个目录,其中有很多想要查看的图像。使用以下命令开始
cd Pictures
display *.JPG
这将按照字母数字顺序顺序加载你的 JPG 文件,每张放在一个简单的窗口中。左键单击图像可以打开一个简单的独立菜单(ImageMagick 中唯一的 GUI 功能)。
例如,如果我显示的数码相片目录中的图像大于我的屏幕尺寸,我不用在显示后单独调整大小,我可以指定:
display -resize 50% *.JPG
-monochrome,将图像转换为黑白(不是灰度),还有 -colors,你可以指定在图像中使用多少种颜色
display -resize 50% -monochrome *.JPG
display -resize 50% -colors 8 *.JPG
convert 命令
第一个命令将单个文件(DSC_0001)从 JPG 转换为 PNG 格式,而不更改原始文件。第二个将对目录中的所有 BMP 图像执行此操作。
convert DSC_0001.JPG dsc0001.png
convert *.bmp *.png
如果要查看 ImageMagick 可以使用的格式,请输入:
identify -list format
convert 命令来处理图像的有趣方法。以下是此命令的一般格式:
convert inputfilename [options] outputfilename
-monochrome 选项没有关联的设置,但 -charcoal 变量需要一个相关因子。根据我的经验,它需要一个小的数字(甚至小于 1)来实现类似于炭笔绘画的东西,否则你会得到很大的黑色斑点。即使如此,图像中的尖锐边缘也是非常明显的,与炭笔绘画不同。
convert monochrome_source.jpg -monochrome monochrome_example.jpg
convert DSC_0008.jpg -charcoal 1.2 charcoal_example.jpg
convert DSC_0032.JPG -edge 3 edge_demo.jpg
convert DSC_0032.JPG -colors 4 reduced4_demo.jpg
convert DSC_0032.JPG -colors 4 -edge 3 reduced+edge_demo.jpg
-canny 选项提供了另外一个惊喜。这是另一种边缘检测器,称为“多阶算法”。单独使用 -canny 可以产生基本黑色的图像和一些白线。我后面跟着一个 -negate 选项:
convert DSC_0049.jpg -canny 0x1 -negate canny_egret.jpg
convert DSC_0023.jpg -canny 0x1 -negate canny_ship.jpg
montage 命令
蒙太奇
montage -label %f DSC_0008.jpg charcoal_example.jpg -geometry +10+10 -resize 25% -shadow -title 'charcoal demo' charcoal_demo.jpg
-label 选项会在每个图像下方标记它的文件名(%f)。不用 -geometry 选项,所有的图像将是缩略图大小(120 像素宽),+10+10 负责边框大小。接下来,我调整了整个最终组合的大小(-resize 25%),并添加了一个阴影(没有设置,因此是默认值),最后为这次 montage 操作创建了一个标题(-title)。
ImageMagick 的一些高级图片查看技巧
使用 display 来查看一系列图片
假如我想查看最近一年的图片,我便可以在命令行中键入下面的 display 命令:
display -resize 35% 2017/*/*/*.JPG
现在假如我想查看某张图片,但我不确定我是在 2016 年的上半年还是在 2017 的上半年拍摄的,那么我便可以使用下面的命令来找到它:
display -resize 35% 201[6-7]/0[1-6]/*/*.JPG
它可以将一系列的图片缩略图放在一张图片中,这样就会非常有用。例如可以使用下面的命令来完成上面的任务:
montage -label %d/%f -title 2017 -tile 5x -resize 10% -geometry +4+4 2017/0[1-4]/*/*.JPG 2017JanApr.jpg
从左到右,这个命令以标签开头,标签的形式是包含文件名(%f)和以 / 分割的目录(%d)结构,接着这个命令以目录的名称(2017)来作为标题,然后将图片排成 5 列,每个图片缩放为 10% (这个参数可以很好地匹配我的屏幕)。geometry 的设定将在每张图片的四周留白,最后指定那些图片要包括到这张合成图片中,以及一个合适的文件名称(2017JanApr.jpg)。现在图片 2017JanApr.jpg 便可以成为一个索引,使得我可以不时地使用它来查看这个时期的所有图片。
GraphicsMagick
给图片加水印
gm composite -gravity southeast -dissolve 50 "x:\waterPage.jpg" "x:\t1.jpg" "x:t2_watermark.jpg"
GraphicsMagick-1.3.5-Q8版本会去掉图片的ICC信息,使用GraphicsMagick-1.3.30-Q16版本即可
输出ICC信息:
gm convert "x:\t1.jpg" "x:\exifdata.app1"
参考:
- http://www.imagemagick.org/script/index.php
- http://www.imagemagick.com.cn/
- http://www.imagemagick.org/script/download.php
- https://github.com/ImageMagick/ImageMagick/tree/master/Magick%2B%2B
- https://legacy.imagemagick.org/script/index.php
- https://www.imagemagick.org/Usage/
- https://www.imagemagick.org/Usage/color_basics/
- ftp://ftp.imagemagick.org/pub/ImageMagick/windows/
- https://legacy.imagemagick.org/script/install-source.php
- https://legacy.imagemagick.org/script/advanced-windows-installation.php
- https://legacy.imagemagick.org/script/download.php
- https://legacy.imagemagick.org/script/ImageMagickObject.php
- http://imagemagick.org/Magick++/
- https://www.imagemagick.org/discourse-server/
- http://www.tuicool.com/articles/NvYfi2
- http://www.tuicool.com/articles/6fyI7z
- http://www.tuicool.com/articles/NN3M7fv
- https://imagemagick.org/script/index.php
- https://github.com/ImageMagick/ImageMagick-Windows
- https://imagemagick.org/script/magick++.php