初始化庫
使用Magick++之前必須要使用InitializeMagick方法初始化庫,根據官方例子來看,這個函數的唯一一個參數永遠是程式路徑
int main(int argc,char **argv)
{
Magick::InitializeMagick(*argv);
}
但是現在的工程預設都是Unicode編碼了,是以這個地方可以通過GetModuleFileNameA來擷取路徑并傳遞進去(嚴格來說應該用UTF8編碼)
int _tmain(int argc, _TCHAR* argv[])
{
CHAR buffer[MAX_PATH] {0};
GetModuleFileNameA(nullptr, buffer, _countof(buffer));
Magick::InitializeMagick(buffer);
}
為了避免名稱沖突,Magick++的所有類或方法等都在"Magick"名稱空間下面。
建立新圖像
Magick::Image 是用的最多的,它代表一個圖像幀,對于一個gif檔案來說,它表示的是圖檔中的某一幀,而不是整個gif檔案。
int _tmain(int argc, _TCHAR* argv[])
{
CHAR buffer[MAX_PATH] {0};
GetModuleFileNameA(nullptr, buffer, _countof(buffer));
Magick::InitializeMagick(buffer);
try
{
// 圖像顔色(紅色)
const Magick::ColorRGB color(1, 0, 0);
// 圖像大小(100x100)
const Magick::Geometry g1(100, 100);
// 建立圖像
Magick::Image image(g1, color);
image.magick("BMP");
image.write("100x100.bmp");
}
catch (Magick::Exception& error)
{
std::cout << "exception: " << error.what() << std::endl;
}
system("pause");
return 0;
}
對于Image對象的建立,官方推薦的做法是在棧上配置設定,不要使用new等方式。Image是自動管理記憶體的,不用手動釋放。
看看這個例子,get方法傳回時引用計數+1了,引用的是同一個對象,而不是copy出新的。
Magick::Image get()
{
const Magick::ColorRGB color(1, 0, 0);
const Magick::Geometry g1(100, 100);
Magick::Image image(g1, color);
image.magick("BMP");
return image;
}
int _tmain(int argc, _TCHAR* argv[])
{
CHAR buffer[MAX_PATH] {0};
GetModuleFileNameA(nullptr, buffer, _countof(buffer));
Magick::InitializeMagick(buffer);
try
{
auto image = get();
image.write("100x100.bmp");
}
catch (Magick::Exception& error)
{
std::cout << "exception: " << error.what() << std::endl;
}
system("pause");
return 0;
}
Magick++還支援通過字元串方式來建立
const Magick::Geometry g1("100x100");
Magick::Image image(g1, "red");
image.magick("BMP");
image.write("100x100.bmp");
上面例子中的大小和顔色都使用了字元串别名方式來聲明。
如果我要指定一個A4紙大小的尺寸,可以這樣聲明
const Magick::Geometry g1("a4");
Magick++内置了一些别名,Geometry的更多使用方法可以參考 https://www.imagemagick.org/Magick++/Geometry.html
對于顔色别名,也是内置了一些,可以參考源碼"\croco\src\cr-rgb.c",變量gv_standard_colors就是内置的顔色别名

另外,如果使用了顔色别名功能,就需要在程式目錄下有一個"color.xml"檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE colormap [
<!ELEMENT colormap (color)+>
<!ELEMENT color (#PCDATA)>
<!ATTLIST color name CDATA "0">
<!ATTLIST color color CDATA "rgb(0,0,0)">
<!ATTLIST color compliance CDATA "SVG">
]>
<!--
Associate a color name with its red, green, blue, and alpha intensities.
A number of methods and options require a color parameter. It is often
convenient to refer to a color by name (e.g. white) rather than by hex
value (e.g. #fff). This file maps a color name to its equivalent red,
green, blue, and alpha intensities (e.g. for white, red = 255, green =
255, blue = 255, and alpha = 0).
-->
<colormap>
<!-- <color name="none" color="rgba(0,0,0,0)" compliance="SVG"/> -->
<!-- <color name="black" color="rgb(0,0,0)" compliance="SVG, X11, XPM"/> -->
<!-- <color name="red" color="rgb(255,0,0)" compliance="SVG, X11, XPM"/> -->
<!-- <color name="magenta" color="rgb(255,0,255)" compliance="SVG, X11, XPM"/> -->
<!-- <color name="green" color="rgb(0,128,0)" compliance="SVG"/> -->
<!-- <color name="cyan" color="rgb(0,255,255)" compliance="SVG, X11, XPM"/> -->
<!-- <color name="blue" color="rgb(0,0,255)" compliance="SVG, X11, XPM"/> -->
<!-- <color name="yellow" color="rgb(255,255,0)" compliance="SVG, X11, XPM"/> -->
<!-- <color name="white" color="rgb(255,255,255)" compliance="SVG, X11"/> -->
</colormap>
這個檔案的作用就是給我們擴充自己的顔色别名用的,檔案裡注釋部分就是例子,不再贅述。
還支援從網絡加載圖檔(隻支援HTTP)
Magick::Image image("http://www.baidu.com/img/bd_logo1.png");
image.write("logo.png");