c++ 如何将imagemagick稀疏颜色重心命令行转换为magick++代码?

mspsb9vt  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(121)

我试图将一个简单的ImageMagick命令行转换为Magick++/c++代码。但是它没有像预期的那样工作。官方网站缺乏API示例。我不能找出问题,即使我潜入相关的实现代码。谷歌没有给予任何提示。

图像魔术命令:

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");
}

C标记列表.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
  • 图像魔术师:7.1.1(构建来源:./configure --使用量程深度=8 && make)

任何帮助都是感激的!
我想magick++代码有相同的效果与命令行

5t7ly7z5

5t7ly7z51#

您几乎就能理解了!也许值得查看一下GenerateCoefficients的源代码,以读取预期的参数,并查看SparseColorOption的源代码,以了解CLI选项是如何解析的。

  • R, G, B值应在0.01.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()

相关问题