Magick::Image::addNoise() 方法是一个很好的起点,但如果你真的想要随机/随机。使用-fx "rand()"。
#include <Magick++.h>
int main(int argc, const char ** argv) {
Magick::InitializeMagick(*argv);
Magick::Image image("100x100", "gray50");
image.fx("rand()");
image.write("noise.jpg");
return 0;
}
马克·塞切尔编辑
尽管我不喜欢编辑其他人的帖子,但我想添加一些太大而无法发表评论而不是竞争答案的内容,所以这是我知道的唯一方法。请随意忽略/删除/脱离这部分!
如果 OP 想要与 12 位值对应的数字,我在命令行上做了一个小实验,看看我如何强制这样做:
convert -size 10000x1 xc:gray -fx "(rand*4096)/quantumrange" -depth 16 -compress none pgm:- | sed '1,3d' | tr " " "\n" | sort -n
这会生成一个 1000 像素的图像,并强制输出为未压缩的 PGM 文件,您可以在其中看到值。然后我对它们进行排序以查看生成的最大值是什么,它是 4096。所以,我认为-fx 我建议的表达式 ((rand*4096)/quantumrange) 可能有助于生成 12 位值。
其他更新
对于使用随机颜色映射区域,FX 表达式可能看起来像...
(i<100 & j<480) ? rand() : u
i & j 或 x/y 偏移量,u 是原始图像。一个有趣的选项,但遍历所有像素会很慢。更快的选择是创建一个随机彩色图像实例并使用Magick::Image.composite 将图像放在另一个图像之上。
#include <Magick++.h>
using namespace Magick;
int main(int argc, const char ** argv) {
InitializeMagick(*argv);
Image wizard("wizard:");
Image rand_img("100x100", "gray50");
rand_img.fx("rand()");
wizard.composite(rand_img, 225, 225);
wizard.write("wizards_make_magick.png");
return 0;
}