1.Introducing the magick++ library

Magick++ (C++), MagickCore (C), MagickWand (C), ChMagick (Ch), JMagick (Java), L-Magick (Lisp),PerlMagick (Perl), MagickWand for PHP (PHP), PythonMagick (Python), TclMagick (Tcl/TK).

● 创建新图像,或读取现有图像,

● 编辑图像:翻转、镜像、旋转、缩放、变换图像、调整图像颜色、应用各种特殊效果,或绘制文本、线条、多边形、圆弧、椭圆和贝塞尔曲线,

● 根据其他图像合成新图像,

● 以多种格式保存图像,包括 GIF、JPEG、PNG、SVG 和 PostScript。

2.Images in the magick++ library

2.1 The geometry class

许多 Magick++ 方法使用“几何”类型的参数来指定(大部分)矩形对象的大小。它可以被认为是一种将二维(x 和 y)封装到单个对象中的机制,该对象可以进一步使用。

2.2 Pixels in magick++ library

the pixelpacket structure

像素的数据格式为“PixelPacket”类型。  'PixelPacket' 是一个用于表示像素的 C 结构。  PixelPacket 成员是:

➢ 'red'

➢ 'green'

➢ 'blue'

➢ 'opacity' :这个 PixelPacket 成员定义了像素的“不透明度”,从而允许图像包含透明度信息(能够保留 图片透明度信息为PNG格式)

the color class

Magick++ 库提供了一个“Color”类,它可以分配给 PixelPacket 数据结构和从 PixelPacket 数据结构分配,从而促进了处理 PixelPacket 数据结构的面向对象的方法。

2.3 The magick++ image object

the image class

Magick++ Image 是一个特殊的对象,它实现了许多特征:

● 具有在输出界面(电脑屏幕、文件等)上自渲染的方法

● 具有关联的画布,其中画布是用于保存图像对象可以渲染的图片数据的数据存储区域

● 它有一组特定的方法,允许以各种方式访问​​图像的画布,从而可以修改图片

● 可以与其他图像对象结合使用,以创建新的合成图像

这个也很像pil中的image对象

the canvas format

Magick++ 图像画布在内部存储为一个连续的像素数组,其中每个像素都是“PixelPacket”类型的结构。

Transparency

正如上面的“PixelPacket 结构”部分所述,单个像素(“PixelPacket”类型)的格式封装了三个基本颜色分量“红色”、“绿色”和“蓝色”,以及一个额外的“不透明度”的信息。 在同一画布上组合多个图像元素时使用“不透明度”组件。

Eaxmples:当在红色背景上绘制一条绿线时,如果红色背景完全不透明,而绿线有 50% 的不透明度,那么生成的线实际上将具有“灰黄色”(请注意,这个“灰黄色”看起来非常不同 来自屏幕上的“真黄色”)。类似地,当将半透明图像放在不透明图像上时,生成的图像将混合来自两个图像的颜色(基于逐像素弯曲过程中涉及的不透明度值)。

注意:如果在“支持图像”上粘贴完全透明的图像,则结果图像的像素将与“支持图像”的像素完全相同,即粘贴图像的不透明度信息不会复制到支持图像,而是使用混合算法。

透明度相关操作的重要限制:

并非所有图像格式都支持透明度,Magick++ 本身在加载/保存包含透明度的图像时有其自身的限制。

● Magick++ 库函数可以加载格式为GIF 或PNG 的包含透明度信息的图像

● 如果保存格式为PNG,Magick++ 库函数可以保留透明度信息

creating an image

图像是使用 Image 类构造器创建的。 创建 Image 对象时会自动创建一个(可能是空的)画布。 创建的 Image 对象使用其关联的画布来存储图片数据,并执行各种图形操作。

注意:Magick++ 文档推荐自动 Image 变量(即在堆栈上分配,通过声明局部变量)作为创建 Image 对象的首选方式,而不是显式分配(通过“new”)。

Accessing image attributes

Reading and wiriting images

如果'Image' 对象以不支持要保存的图像的全色集的格式保存,则'Image::write()' 方法将改变正在保存的图像。

Getting direct access to the canvas pixels

The pixel cache:getting indirect access to an image canvas

构成图像对象画布的像素(类型为“PixelPacket”)也可以使用一种特殊方法访问,该方法涉及创建“图像像素缓存”,顾名思义,它是一个临时(缓存)工作区,其中 可以执行许多图形操作,而无需在每次此类操作后更新图像本身。

Blobs:storing encoded images in memory

Magick++ 提供了“Blob”类来表示以编码格式存储在内存中的图像。

3.drawable objects

Magick++ 绘图机制基于创建“可绘制对象”,然后使用特定方法将其放置在画布上; 这些方法指定放置可绘制对象的位置、绘制操作的透明度等。

3.1 foundation concepts of the magick++ drawing mechanism

The generic drawable class

“Drawable”类是一个基类,所有可绘制对象类都从该基类派生。 所有图形对象类(例如“DrawableLine”、“DrawableArc”、“DrawableBezier”等)都派生自基“DrawableBase”类。

The coordinate class

“坐标”结构表示一对 (x,y) 坐标,“坐标列表”表示“坐标”类型的对象列表(即列表<坐标>)。  Drawable 类的一些构造函数接受和/或需要坐标或坐标列表作为参数。坐标系 (0,0) 位置的默认值是执行绘图的图像画布的左上角,而绘图的默认旋转角度为 0。

Types of drawable objects

根据绘制对象在图像画布上产生的效果,可绘制对象分为两类:Renderable objects 和 Control objects.Renderable object根据其几何形状有效的修改画布上一组特定像素,例子是drawableline,Control object在绘制时不会在画布上立即产生效果,而是控制渲染对象的绘制方式,例如DrawableStrokeColor。

GravityType

GravityType 是一种枚举类型,用于指定图形对象在 Image 范围内的位置。

3.2 Drawing on an image canvas

所有可绘制对象都可以使用 'Image::draw()' 方法在 Image 的画布上绘制。

The draw() method

● draw() 方法接受作为参数的可绘制对象既可以是Rendering objects,也可以是Control objects。

● 可绘制对象可以通过对每个要绘制的对象连续调用 Image::draw(Drawable) 方法“一个接一个地”绘制,或者可以通过传递一个 list<Drawable 来“一次性”绘制 > Image::draw() 方法的对象。

3.3 setting up draw() parameters

在开始执行一系列绘制操作之前,可以和/或必须进行许多绘制参数相关的设置,例如 在实际绘制图形之前设置“笔”颜色(又名“描边颜色”)参数等。强烈建议不要依赖绘图设置的任何隐式默认值,因为它们会产生非常违反直觉的结果。

drawing objects one-by-one

在此绘图场景中,对将要绘制的 Image 对象进行设置,然后在 Image 画布上执行一系列绘制操作。

drawing objects all-at-once

在这个绘图场景中,会生成一个可绘制对象的列表,然后将其批量传递给 draw 方法。 在这种情况下,必须构建一组特殊的“格式化”控制对象来确定“批量绘制”操作的参数。

text formatting objects

这些对象决定了在画布上“绘制文本”时的字体和大小

formatting objects for outlines

这些对象决定了可绘制对象轮廓的绘制特性

formatting objects for fill operations

这些对象确定需要填充操作时将使用的填充颜色和不透明度

formatting objects for setting the drawing pattern for outlines

设置线条绘制的非连续模式

3.4 Renderable objects

line and polyline

要在画布上绘制一条线(段)/多段线,请结合使用“DrawableLine”/“DrawablePolyline”对象和“draw()”方法。

polygons

为了在画布上绘制多边形形状,Magick++ 库提供了一个通用的“DrawablePolygon”类和一个专门用于绘制矩形的类:“DrawableRectangle”。

● “DrawablePolygon”构造函数需要一个坐标列表作为参数。 根据 list<Coordinate> 中元素的数量,“DrawablePolygon”对象可能描述一个三角形(list<Coordinate> 中的 3 个元素)、四边形(4 个元素)等。

● 'DrawableRectangle' 构造函数需要矩形左上角和右下角的坐标

circle,ellipses,arcs

了绘制圆弧、整圆、椭圆等,Magick++ 库提供了 DrawableArc 对象

text

可以使用两种基本方法在画布上放置文本:drawinng the text inside a canvas or annotating a full image.

使用 Image 'draw()' 方法:

当使用 'Image::draw()' 方法在图像画布上绘制文本时,必须创建一个 'DrawableText' 对象并与 draw() 方法一起使用。  'DrawableText 对象包含有关要在画布上“打印”的字符的信息,以及画布上必须放置文本的精确位置。

Annotating an image using the image annotate() method

'Image::annotate()' 方法允许将文本放置在图像的画布中,方法是仅指定相对于图像中心的位置,将放置文本.

4.Global image operations

4.1 overlaying images

Magick++ 通过 Image 对象的 'Image::composite()' 方法支持图像叠加。 此方法在给定的“support_image”上放置一个“image_to_overlay”:

support_image.composite(image_to_overlay, parameters)

4.2 extract a sub-image from another image

Magick++ 支持通过两种 Image 方法从另一个图像中提取“子图像”:'chop()' 和 'crop()'。Chop() 和crop() 方法都通过仅保留原始区域的特定区域并简单地丢弃其余区域来调整它们操作的图像画布的大小。

Image::chop(Geometry(double x, double y)); // see details below
Image::crop(Geometry(double x, double y));

'chop()' 和 'crop()' 方法都只接受一个类型为 'Geometry' 的参数

注意:因为这些方法会修改调用它们的原始图像对象,所以应该在原始图像的副本上使用它们以保留原始图像。

extracting a region from within an image

// let us assume a source_image from 'source_image.gif' file that has 400x400 resolution
Image source_image("source_image.gif");
// to avoid altering the source_image, make a copy of it and operate on the copy
Image sub_image(source_image);
// chop the sub_image: after chop(), the sub_image will contain the
// (100, 100, 400, 400) area from source_image (chopped image)
sub_image.chop(Geometry(100,100));
// crop the sub_image: after crop(), the sub_image will contain the
// (100, 100, 300, 300) area from source_image (chopped and cropped image)
sub_image.crop(Geometry(200,200)); // after this point in the code, 'sub_image'
// contains the desired area from 'source_image'

4.3 global image modifications

resizing an image

Magick++提供了用于调整图像大小的Image::zoom()方法。此方法使用给定的正“缩放因子”值调整图像大小:如果0<缩放因子<1,图像将缩小(即缩小);如果缩放系数>1,图像将放大(即,图像将被放大)。

Rotating an image

“Image::rotate()”方法以给定角度旋转整个图像。如果包含旋转图像需要放大图像画布;但是,图像画布永远不会收缩,即使旋转后的图像可以放在比原始图像更小的画布中。

如果旋转后的图像画布大于原始图像,则在当前Magick++版本中,与旋转后的原始图像不对应的区域将填充为完全不透明的白色。

color modifications on an image,or an image area

更改图像或部分图像的全局颜色的方法是为所需区域创建像素缓存,然后依次更改每个像素的各个组件(“红色”、“绿色”、“蓝色”和“不透明度”)。

blurring an image

为了对整个图像画布应用模糊效果,Magick++提供了基于高斯分布的“image::blur()”方法。模糊过滤器作用于画布的每个像素,将其值设置为给定半径内其周围像素的加权平均值。

5.Briefly displaying an image

Magick++库提供了“Image::display()”方法,该方法弹出一个包含显示器上图像的窗口,并停止程序执行,直到手动关闭该窗口。

Exceptions

每当Magick++操作失败时,就会自动引发异常。在Magick++中有两个重要的基类例外,它们都是从标准的C++异常类派生出来的:“Magick::Error”和“Magick::Warning”。

总结:看magick++的一些功能,magick++是imagemagick的c++接口,magickcore是核心的c代码,总体上看magick++还是不如pil强大的,pil的功能还是要比magick++多一点,不过很多时候我们也是直接调magickcore中的一些接口。第一块,magick++中主要的对象包括geometry,pixels,image对象,这里面又属image这个对象的方法要多一些,和pil近似了,读图,存图,获取图的一些属性,包括透明度什么的,第二块,主要包括draw的方法,绘图机制创建可会知对象,使用特定方法放在画布上,包括text,image等,填充颜色,透明度,绘制线条,包括一些渲染,线,多段线,矩形,多边形,圆弧,圆,椭圆,text绘制等。第三块主要是一些全局的操作,比如合图,crop,copy,resize,旋转,更改颜色像素等。一共就这三大块,c++接口还是比较简单的。

imagemagick:a gentle introduction to magick++相关推荐

  1. 图解GNN:A Gentle Introduction to Graph Neural Networks

    目录 前言 1.图是什么? 2.数据如何表示成图? 2.1 图像 2.2 文本 2.3 其他数据 2.3.1 分子 2.3.2 社交网络 2.3.3 引文图 3.图中的任务 3.1 图级任务 3.2 ...

  2. 【GNN】图解GNN: A gentle introduction(含视频)

    目录 GNN Why What Tasks How ​编辑 关键 MP ​编辑 GCN ​编辑 GAT 参考 GNN Why What Tasks 目前最常见还是节点分类和链接预测 图分类常见于蛋白质 ...

  3. Distill文章-A gentle introduction to graph Neural Networks(图神经网络是怎么构造的)

    目录 1 简介 2 图的介绍 3 数据如何表示成图 4  三大类问题 5 将机器学习(神经网络)用在图上,会遇到什么挑战 6 最简单的GNN 7 信息传递(把图结构的信息考虑进去) 8  GNN的pl ...

  4. GNN博客-A Gentle Introduction to Graph Neural Networks

    原文链接:A Gentle Introduction to Graph Neural Networks 概述 全文可以分为四个部分,1)什么样的数据能被表达成图:2)图表和其他数据之间的不同,以及在使 ...

  5. A Gentle Introduction to Deep Learning for Graphs 图深度学习的温和介绍

    文章目录 1.简介 2. 高级概述 2.1.数学符号 2.2.动机 2.3.大图 2.4.局部关系和信息的迭代处理 2.5.语境扩散的三种机制 3.构建块 3.1.邻域(邻居)聚集 3.2.池化 3. ...

  6. 《A Gentle Introduction to Graph Neural Networks》要点

    A Gentle Introduction to Graph Neural Networks 1.架构 该篇文章总共有4块信息:什么数据可以表示成一张图.图和别的数据有什么不一样的地方 为什么要用图神 ...

  7. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](7)

    [论文阅读]A Gentle Introduction to Graph Neural Networks [图神经网络入门](7) Into the Weeds Other types of grap ...

  8. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](6)

    [论文阅读]A Gentle Introduction to Graph Neural Networks [图神经网络入门](6) GNN playground Some empirical GNN ...

  9. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](5)

    [论文阅读]A Gentle Introduction to Graph Neural Networks [图神经网络入门](5) Graph Neural Networks 图神经网络 Now th ...

  10. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](4)

    [论文阅读]A Gentle Introduction to Graph Neural Networks [图神经网络入门](4) The challenges of using graphs in ...

最新文章

  1. 分布式文件系统KFS源码阅读与分析(四):RPC实现机制(KfsClient端)
  2. torch 多进程队列 问题
  3. 杜克大学出来的NBA球星有哪些?
  4. IOS基础之iPad的屏幕旋转方向判断
  5. Linux探秘之用户态与内核态
  6. spring cache相关注解介绍 @Cacheable、@CachePut、@CacheEvict
  7. DockOne技术分享:十个问题带你了解Windows Docker
  8. 建立、遍历二叉树(二叉链表)
  9. 体育赛事中的概率计算问题
  10. Aptana 添加jQuery提示
  11. xcode swift_CocoaPods Swift XCode教程
  12. Eclipse Maven项目搭建SSM
  13. 你知道Thread线程是如何运作的吗?
  14. 梵语和藏语_《百字明》梵文和藏文发音区分
  15. java递归获取所有的子级节点
  16. Pandas——数据清洗1
  17. 【渝粤教育】电大中专跨境电子商务理论与实务 (13)作业 题库
  18. python爬取百度在线语音合成的音频
  19. 浅谈缓冲的理论与实践
  20. 句子很美,看得叫人掉泪

热门文章

  1. 密码系列-Base32
  2. 【Go语言】动态库和静态库详解
  3. Error: DPI-1047: Cannot locate a 64-bit Oracle Client library: “问题
  4. 强大的图表制作,前端数据可视化,echarts
  5. 微信小程序自定义弹窗2.0
  6. Intel-80386微处理器(IA-32架构)
  7. 学习云计算就业方向有哪些 一般薪资能拿多少
  8. 对LNode*与LinkLinst等价却不等用的理解
  9. Minimax博弈算法设计井字棋AI(Golang)
  10. [PKUWC2018] Minimax