沿圆重复图像

时间:2014-04-01 19:01:48

标签: imagemagick magick++

如何沿圆圈重复图像?请注意,它也应该失真一点。我想要的是:我一直在研究一种POV LED设计,它可以拍摄一张图像,并在整个物体旋转时沿着一串LED闪烁。当你看显示器时,图像会稍微扭曲,沿着圆圈的内部压扁并在外面伸展一点。我想重新创建它。

红色圆圈仅供参考,且大小始终相同。我也可能将它留在最终的复合材料中。沿着圆形路径重复图像的频率应该根据原始图像的实际宽度进行调整(以及我是否在每个副本之间添加间隔。)例如,有些图像紧挨着彼此,没有休息,还有其他需要休息的人。所以我需要一种方法来定义它。

使用黄色对角线,我不希望图像在重复时间断。我将白色边缘留在顶部,以显示它是如何扭曲的。

如何使用Magick ++实现这一目标?最后,我将把代码整合到一个大型应用程序中,该应用程序使用Magick ++来处理用户为POV LED显示屏导入的图像。

谢谢!

Repeating Image

2 个答案:

答案 0 :(得分:2)

是的,您可以使用Magick::Image.distort完成围绕圆圈的平铺图像。一些试验和一些因为您对POV项目有非常本地化的要求,所以会出现错误。

沿圆圈重复图像

ArcDistortion示例同样适用于Magick++。确保启用虚拟像素方法,并使用360度弧扭曲给定图像。我正在使用image" pattern:CHECKERBOARD",但你会使用" tile:image_source.png"。

Magick::Image MyArc;
MyArc.read("pattern:CHECKERBOARD");
MyArc.size("600x45");
MyArc.virtualPixelMethod(Magick::WhiteVirtualPixelMethod);
const double arcArgs[1] = {360};
MyArc.distort(Magick::ArcDistortion,1, arcArgs,Magick::MagickTrue);
MyArc.write("out.png");

这将为您提供沿圆圈的重复图像。

Example arc distortion

Preserver Inner Circle

控制内部和外部的大小。外圈。应用第三&失真方法的第四个参数。

const double arcArgs[4] = {360,0,200,100};
MyArc.distort(Magick::ArcDistortion,4, arcArgs,Magick::MagickTrue);

Example arc distortion around given circle

带预处理的自定义图像

添加空格,填充,渗色和调整图像重复。这些都需要在电弧失真之前进行预处理。

Magick::Image SourceImage;
SourceImage.read("me.png");
SourceImage.resize("45x45");
// Add whitespace between repeating image
SourceImage.extent(Magick::Geometry(100,45));

// Resize image to be "long" enough to bend around arc.
SourceImage.size("600x45");
// PrePrecess image to tile horizontally with Edge Virtual Pixel
SourceImage.virtualPixelMethod(Magick::HorizontalTileEdgeVirtualPixelMethod);
const double tileArgs[1] = {0};
SourceImage.distort(Magick::ScaleRotateTranslateDistortion,1,tileArgs,Magick::MagickTrue);

// Distort around circle
SourceImage.virtualPixelMethod(Magick::WhiteVirtualPixelMethod);
const double arcArgs[4] = {360,0,200,100};
SourceImage.distort(Magick::ArcDistortion,4, arcArgs,Magick::MagickTrue);
SourceImage.write("out.png");

Arc distortion with custom image frequency

如果可以使用fun math解决POV问题,请记住很多。

答案 1 :(得分:0)

我想我明白了。所以这里是我正在使用的代码片段:

Magick::Image srcImage;
srcImage.read("001.png");
srcImage.resize("x100");      // I want images at least 100 pixels high
Magick::Color color(0, 0, 0); // images should always be on a black background

// to add space beween a repeating image, add a value to .columns()
// for example:
// srcImage.extent(Magick::Geometry(srcImage.columns() + 10, 100), color);
// will add 10 pixels of space or padding after each image repeat
srcImage.extent(Magick::Geometry(srcImage.columns(), 100), color);

// preprocess
// .columns() is multiplied by the amount of times the image repeats in the circle
// for example, this repeats the image 8 times:
// srcImage.size(Magick::Geometry(srcImage.columns() * 8, 100));
srcImage.size(Magick::Geometry(srcImage.columns() * 8, 100));
srcImage.virtualPixelMethod(Magick::HorizontalTileEdgeVirtualPixelMethod);
const double tileArgs[1] = {0};
srcImage.distort(Magick::ScaleRotateTranslateDistortion, 1, tileArgs, Magick::MagickTrue);

// distort
srcImage.virtualPixelMethod(Magick::BlackVirtualPixelMethod);
const double arcArgs[4] = {360, 0, 98, 30};
srcImage.distort(Magick::ArcDistortion, 4, arcArgs, Magick::MagickTrue);
srcImage.write("001-out.png");