Imagemagick 沿圆圈重复图像

Imagemagick 沿圆圈重复图像,imagemagick,magick++,Imagemagick,Magick++,如何沿圆重复图像?请注意,它也应该有点失真。我想说的是:我一直在研究一种POV LED设计,它可以在整个旋转过程中拍摄图像并沿一串LED闪烁。当你看显示器时,图像有点扭曲,沿着圆圈的内部挤压,而在外部拉伸。我想重现一下 红色圆圈仅供参考,大小始终相同。我可能也会把它留在生成的合成中。图像沿圆路径重复的频率应根据原始图像的实际宽度(以及我是否在每个副本之间添加中断)进行调整。例如,有些图像相邻平铺,没有中断,有些图像需要中断。所以我需要一种方法来定义它 对于黄色的对角线,我不希望在图像重复时在图像

如何沿圆重复图像?请注意,它也应该有点失真。我想说的是:我一直在研究一种POV LED设计,它可以在整个旋转过程中拍摄图像并沿一串LED闪烁。当你看显示器时,图像有点扭曲,沿着圆圈的内部挤压,而在外部拉伸。我想重现一下

红色圆圈仅供参考,大小始终相同。我可能也会把它留在生成的合成中。图像沿圆路径重复的频率应根据原始图像的实际宽度(以及我是否在每个副本之间添加中断)进行调整。例如,有些图像相邻平铺,没有中断,有些图像需要中断。所以我需要一种方法来定义它

对于黄色的对角线,我不希望在图像重复时在图像之间出现中断。我在顶部留下了白色的边缘,以显示它是如何扭曲的

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

谢谢


是的,您可以使用
Magick::Image.扭曲
来完成围绕一个圆平铺图像。虽然一些尝试和错误将是预期的,因为您有非常本地化的要求,为您的POV项目

沿圆圈重复图像 示例同样适用于
Magick++
。确保启用虚拟像素方法,并以360度圆弧扭曲给定图像。我使用的是图像“pattern:checkboard”,但您会使用“tile:image\u source.png”

Magick::Image MyArc;
MyArc.read(“模式:棋盘”);
MyArc.尺寸(“600x45”);
MyArc.virtualPixelMethod(Magick::WhiteVirtualPixelMethod);
常数双圆弧[1]={360};
扭曲(Magick::arctortion,1,arcArgs,Magick::MagickTrue);
MyArc.write(“out.png”);
这将为您提供沿圆的重复图像

保持内环 控制内外圆的大小。将第三个和第四个参数应用于失真方法

const-double-arcArgs[4]={360,020100};
扭曲(Magick::arctortion,4,arcArgs,Magick::MagickTrue);

具有预处理功能的自定义图像 至于添加空白、填充、出血和调整图像重复。这些都需要在电弧变形之前进行预处理

Magick::Image SourceImage;
SourceImage.read(“me.png”);
SourceImage.resize(“45x45”);
//在重复图像之间添加空白
范围(Magick::Geometry(100,45));
//将图像大小调整为“足够长”以绕弧弯曲。
SourceImage.size(“600x45”);
//印前图像与边缘虚拟像素水平平铺
virtualPixelMethod(Magick::HorizontalTiledgeVirtualPixelMethod);
常数双瓦耳[1]={0};
扭曲(Magick::scalerotetranslatedistoration,1,tileArgs,Magick::MagickTrue);
//绕圆扭曲
virtualPixelMethod(Magick::WhiteVirtualPixelMethod);
常数双圆弧[4]={360,020100};
扭曲(Magick::arctortion,4,arcArgs,Magick::MagickTrue);
SourceImage.write(“out.png”);


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

我想我已经解决了。下面是我正在处理的代码片段:

Magick::Image srcImage;
srcImage.read(“001.png”);
srcImage.resize(“x100”);//我想要至少100像素高的图像
Magick::彩色(0,0,0);//图像应始终位于黑色背景上
//要在重复图像之间添加空间,请向.columns()添加一个值
//例如:
//extent(Magick::Geometry(srcImage.columns()+10100),颜色);
//将在每次图像重复后添加10像素的空间或填充
extent(Magick::Geometry(srcImage.columns(),100),颜色);
//预处理
//.columns()乘以图像在圆中重复的次数
//例如,这会将图像重复8次:
//size(Magick::Geometry(srcImage.columns()*8100));
size(Magick::Geometry(srcImage.columns()*8100));
srcImage.virtualPixelMethod(Magick::horizontalTiledgevirtualpixelmethod);
常数双瓦耳[1]={0};
扭曲(Magick::scalerotetranslatedistoration,1,tileArgs,Magick::MagickTrue);
//歪曲
srcImage.virtualPixelMethod(Magick::BlackVirtualPixelMethod);
常数双圆弧[4]={360,0,98,30};
扭曲(Magick::arctortion,4,arcArgs,Magick::MagickTrue);
srcImage.write(“001 out.png”);

嘿,谢谢你的详细解释。如果你不介意的话,你能给我解释几句话吗?具体来说,这是最后一段与图像一起工作的代码。我知道您在哪里将其调整为45x45图像。下一行,为什么要扩展到100x45?这是为了在图像之间添加空白吗?下一步,当您将其尺寸设置为600x45时,又一次,这是为什么呢?更新了答案并添加了行注释。实际上,“600x45”的宽度应该是所需的周长。应该调整它以匹配POV中的关注点,但是您可以通过计算
(bottomRadius*2+imageHeight/2)*PI来获得一个起点,谢谢!现在,我将继续我的下一步,它将为它添加一些逻辑。高过宽的图像需要重复的次数更多,而宽过高的图像需要重复的次数更少。目前,我正在手动操作,但我希望最终能得到一组自动处理的平均数字。我在考虑计算出比例,然后从那里开始。这部分是关于图像的可视化(在POV棒上旋转后的外观)。再次感谢您的帮助!看起来不错!你应该+1我的答案,但是接受你自己的答案而不是我的。这