【问题标题】:How do I procedurally generate images using rust-image?如何使用 rust-image 在程序上生成图像?
【发布时间】:2015-04-24 00:43:40
【问题描述】:

我想学习 Rust,并认为以程序方式生成图像会很有趣。我不知道从哪里开始...piston/rust-image?但即便如此,我应该从哪里开始呢?

【问题讨论】:

  • 顺便说一句,如果问题是具体的,例如,问题将得到更好的答案(因此对您更有帮助)。包括what you have tried,以及您感到困惑/迷失的地方,例如也许您不知道如何安装库,也许您不确定如何创建要修改的图像。我在回答中假设了后者,但我不确定!如果您仍然迷路,请务必澄清问题。
  • 欢迎来到 Stack Overflow!除了现有的建议,您还应该阅读What topics can I ask aboutHow to ask a good question。例如,不清楚您是否有任何语言的程序图像生成经验。不幸的是,SO 仍然不适合回答这么广泛的问题!
  • 你说得对,这是一个非常广泛的问题。谢谢你的耐心。 @huon-dbaupp 明白了:我想知道的是如何创建图像、编辑它并保存它。程序性的东西可以稍后来。再次感谢。

标签: image rust procedural


【解决方案1】:

docsthe repository 开始。

从文档的登录页面上看不是很明显,但image 中的核心类型是ImageBuffer

new function 允许构造一个ImageBuffer 表示具有给定/宽度的图像,存储给定类型的像素(例如RGB,或with transparency)。可以使用pixels_mutget_pixel_mutput_pixel(后者在文档中的pixels_mut 下方)等方法来修改图像。例如

extern crate image;

use image::{ImageBuffer, Rgb};

const WIDTH: u32 = 10;
const HEIGHT: u32 = 10;

fn main() {
    // a default (black) image containing Rgb values
    let mut image = ImageBuffer::<Rgb<u8>>::new(WIDTH, HEIGHT);

    // set a central pixel to white
    image.get_pixel_mut(5, 5).data = [255, 255, 255];

    // write it out to a file
    image.save("output.png").unwrap();
}

看起来像:

回购作为起点特别有用,因为它包含示例,特别是它具有以编程方式生成an imagean example。使用新库时,我会打开文档,如果感到困惑,我会打开 repo 以查找示例。

【讨论】:

  • 附带说明,我希望像“elmesque”这样的东西可以针对“rust-image”实施,而不是需要活塞的更多面向桌面的部分。
  • 非常感谢!那是文档中缺少的示例来运行!
  • 这段代码无法编译,因为现在Imagebuffer 需要两个参数:像素类型和存储它的容器。例如,您应该更改为let mut image = ImageBuffer::&lt;Rgb&lt;u8&gt;, Vec&lt;u8&gt; &gt;::new(WIDTH, HEIGHT);
  • 我使用image 0.15.0 得到.save() 的“预期2 个参数”。我无法使该功能正常工作。还尝试了image.save("out.png", image::PNG)image.save(&amp;Path::new("out.png), image::PNG) :(
【解决方案2】:

由于@huon 的答案是 6 岁,我在重现结果时遇到了错误,所以我写了这个,

use image::{ImageBuffer, RgbImage};

const WIDTH:u32 = 10;
const HEIGHT:u32 = 10;

fn main() {
    let mut image: RgbImage = ImageBuffer::new(WIDTH, HEIGHT);
    *image.get_pixel_mut(5, 5) = image::Rgb([255,255,255]);
    image.save("output.png").unwrap();
}

【讨论】:

    最近更新 更多