如何使用rust-image进行程序化图像生成?

15

我想学习Rust编程语言,打算用它来生成图像。但是我不知道从哪里开始......piston/rust-image?即使使用这个库,我也不知道该从哪里开始。


顺便说一句,如果问题具体一些,例如包括你尝试过什么以及你迷失在哪里的地方,那么问题将得到更好的答案(因此对你更有帮助)。举个例子,也许你不知道如何安装库,也许你不确定如何创建要修改的图像。我在我的答案中假设了后者,但我不确定!如果你还是迷失了,一定要澄清问题。 - huon
欢迎来到Stack Overflow!除了现有的建议外,您还应该阅读我可以问什么话题如何提出一个好问题。例如,不清楚您是否有任何语言中的过程图像生成经验。不幸的是,SO仍然不适合回答那么广泛的问题! - Shepmaster
你说得对,这是一个非常宽泛的问题。感谢您的耐心等待。@huon-dbaupp说得很对:我想知道的是如何创建图像、编辑它并保存它。程序性的东西可以稍后再来。再次感谢。 - Rik
2个回答

17
起始点是文档代码库
从文档的首页上并不明显,但image中的核心类型是ImageBuffer

new函数允许构造一个ImageBuffer表示具有给定宽度的图像,存储给定类型(例如RGB或具有透明度)的像素。可以使用诸如pixels_mut, get_pixel_mutput_pixel等方法来修改图像。例如:

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

它看起来像这样:output

这个代码库特别有用作为一个起点,因为它包含了一些示例,尤其是它有一个示例可以编程生成一张图片。当我使用新的库时,我会打开文档,如果困惑,就会去查找这个代码库中的示例。

注意:

get_pixel_mut从0.24.0版本开始已被弃用:请改用get_pixel和put_pixel。


顺便说一句,我希望像“elmesque”这样的东西被实现在“rust-image”中,而不是需要Piston更多面向桌面的部分。 - ArtemGr
非常感谢!这个例子在文档中一直缺失,现在可以运行了! - Tristram Gräbener
8
这段代码无法编译,因为现在 ImageBuffer 需要两个参数:像素类型和容器来存储它。您应该改为,例如,let mut image = ImageBuffer::<Rgb<u8>, Vec<u8> >::new(WIDTH, HEIGHT); - Month
2
我使用 image 0.15.0.save() 函数时出现了“期望2个参数”的错误提示。我无法让这个函数正常工作。我还尝试了 image.save("out.png", image::PNG)image.save(&Path::new("out.png), image::PNG),但都不行 :( - Niklas R

6
由于@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();
}

为了避免与ImageBuffer的更改冲突,最好直接构造RgbImage实例: let mut image: RgbImage = RgbImage::new(WIDTH, HEIGHT); - Kaplan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接