如何使用ImageMagick或Magick ++从图像中提取多边形

3

我希望使用Magick++或者图片魔术命令行从图片中提取一个n边形。这个n边形由点的列表定义。例如,我希望能够提取由点a、b、c、d、e、f、g、h定义的n边形,这个n边���看起来像:

      a---------h
      |         |
      |         g-f
      |           |
      b---c       |
          |       |
          |       |
          |       |
          d-------e

我想从一个png图像中提取图像,我认为我需要使用图像掩模进行某种合成操作,如果使用Magick++,则需要定义DrawableClipPath。但是,我找不到任何相关文档。希望能得到帮助。

p.s. 我更喜欢使用C++和Magick++来完成这个任务,因为我还有其他处理要做,但我也可以使用命令行来完成它。


请检查此线程是否包含您所需的内容:http://www.webmasterworld.com/php/4528427.htm - Leo
1个回答

3
您可以使用 Magick::DrawablePolygonMagick::Image.composite 的组合。
创建一个新的蒙版图片,并绘制 n-gon 形状。
Magick::Image mask;
mask.draw( Magick::DrawablePolygon( std::list<Magick::Coordinate> ) );

然后只需将遮罩应用于目标图像,并组合现有的源图像。
Magick::Image dest;
dest.composite( Magick::Image, Magick::Geometry, Magick::CompositeOperator );

例子:

#include <iostream>
#include <Magick++.h>

int main(int argc, const char ** argv)
{
    Magick::InitializeMagick(*argv);

    Magick::Image mask( Magick::Geometry(120,120), Magick::Color("white"));
    Magick::Image dest( Magick::Geometry(120,120), Magick::Color("white"));

    // Example source image
    Magick::Image source;
    source.read("rose:");
    source.resize(Magick::Geometry(200,120)); // Resize for fun

    mask.fillColor("black");

    // Define points
    std::list<Magick::Coordinate> points;
    points.push_back(Magick::Coordinate(10, 10)); // a
    points.push_back(Magick::Coordinate(10, 50)); // b
    points.push_back(Magick::Coordinate(30, 50)); // c
    points.push_back(Magick::Coordinate(30,100)); // d
    points.push_back(Magick::Coordinate(75,100)); // e
    points.push_back(Magick::Coordinate(75, 30)); // f
    points.push_back(Magick::Coordinate(60, 30)); // g
    points.push_back(Magick::Coordinate(60, 10)); // h

    // Draw Polygon "n-gon"
    mask.draw( Magick::DrawablePolygon(points) );

    // Extract n-gon from source image to destination image
    dest.clipMask(mask);
    Magick::Geometry offset(0,0,0,0);
    dest.composite( source, offset, Magick::OverCompositeOp );

    dest.write("n-gon.png"); // Output
}

n-gon


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