如何将 imagemagick sparse-color Barycentric 命令行转换为 magick++ 代码?

问题描述 投票:0回答:1

我正在尝试将一个简单的 ImageMagick 命令行转换为 Magick++/c++ 代码。但是它没有按预期工作。官网缺少API示例。即使深入研究相关的实现代码,我也无法找出问题所在。谷歌没有给出任何提示。

ImageMagick 命令:

convert -size 543x114 xc: -sparse-color Barycentric '0,0 red 0,%h blue' gradient.png

我想通过下面的代码复制它的效果,但是输出不一致

Magick++代码:

#include <Magick++.h>

int main()
{
    int width = 543;
    int height = 114;
    Magick::Image gradImage(Magick::Geometry(width, height), Magick::Color("white"));
    // installed magick++ is built --with-quantum-depth=8
    double maxRGB = 255;

    double args[] = {
        0, 0,
        maxRGB, 0, 0,
        0, height,
        0, 0, maxRGB
    };

    gradImage.sparseColor(
        (Magick::ChannelType)((Magick::DefaultChannels & ~Magick::OpacityChannel) & ~Magick::IndexChannel),
        Magick::BarycentricColorInterpolate,
        sizeof(args) / sizeof(double),
        args
    );

    gradImage.write("gradient.png");
}

CMakelist.txt:

cmake_minimum_required(VERSION 3.16)

project(demo)
find_package(ImageMagick COMPONENTS Magick++)
include_directories(
    ${ImageMagick_INCLUDE_DIRS}
)

add_executable(
    demo
    main.cpp
)

target_link_libraries(
    demo
    ${ImageMagick_Magick++_LIBRARY}
)

由命令生成:

由 magick++ 生成:

其他信息:

  • 操作系统:Ubuntu 20.04
  • ImageMagick:7.1.1(从源代码构建:./configure --with-quantum-depth=8 && make)

感谢任何帮助!

我希望 magick++ 代码与命令行具有相同的效果

c++ imagemagick magick++ graphical-programming
1个回答
0
投票

你快搞定了!

GenerateCoefficients
阅读预期的参数,以及
SparseColorOption
查看 CLI 选项是如何解析的。

  • R, G, B
    值应在
    0.0
    1.0
    之间的范围内。
  • 您至少需要 3 个点,因为重心系数与仿射系数相同。
  • 如果您不针对颜色特征/遮罩,只需使用
    DefaultChannels
    .

尝试以下...

#include <Magick++.h>

int main(int argc, char **argv)
{
  double
    width = 543.0,
    height = 114.0;
  Magick::InitializeMagick(*argv);
  Magick::Geometry rect((int)width, (int)height);
  Magick::Image gradImage(rect, Magick::Color("white"));
  Magick::ColorRGB color1("red");
  Magick::ColorRGB color2("blue");
  double args[15] = {
        0,      0, color1.red(), color1.green(), color1.blue(),
    width,      0, color1.red(), color1.green(), color1.blue(),
        0, height, color2.red(), color2.green(), color2.blue()
  };
  gradImage.sparseColor(
    Magick::DefaultChannels,
    Magick::BarycentricColorInterpolate,
    15,
    args
  );
  gradImage.write("gradient.png");
}

别忘了先打电话给

Magick::InitializeMagick()

© www.soinside.com 2019 - 2024. All rights reserved.