Rust 在位图中绘制一条线(可能使用活塞)

Rust 在位图中绘制一条线(可能使用活塞),rust,Rust,我想在位图中画一条线,例如从像素(10,10)到像素(90,90)。该行必须具有特定的宽度 使用活塞图像,我能够绘制单个像素: let mut image = ImageBuffer::<image::Rgb<u8>>::new(100, 100); image.get_pixel_mut(5, 5).data = [255, 255, 255]; image.save("output.png"); 让mut image=ImageBuffer:::新建(100100)

我想在位图中画一条线,例如从像素(10,10)到像素(90,90)。该行必须具有特定的宽度

使用活塞图像,我能够绘制单个像素:

let mut image = ImageBuffer::<image::Rgb<u8>>::new(100, 100);
image.get_pixel_mut(5, 5).data = [255, 255, 255];
image.save("output.png");
让mut image=ImageBuffer:::新建(100100);
image.get_pixel_mut(5,5).data=[255,255,255];
image.save(“output.png”);
然而,没有方法来画一条线


我想我必须使用活塞::图形来实现这一点,但我找不到任何ressource如何实现这一点(任何示例都涉及一个提供图形工作环境的窗口)。

如果您放弃了宽度要求,也不需要抗锯齿,那么您可以使用类似(也可以使用):

外部板条箱图像;
使用图像::rgb图像;
fn绘制线(img:&mut RgbImage,x0:i64,y0:i64,x1:i64,y1:i64){
//为移动起点创建局部变量
设mut x0=x0;
设mut y0=y0;
//获取绝对x/y偏移
设dx=if x0>x1{x0-x1}else{x1-x0};
设dy=如果y0>y1{y0-y1}或者{y1-y0};
//爬坡
设sx=if x0dy{dx}else{-dy}/2;
让mut err2;
环路{
//设置像素
img.get_pixel_mut(x0为u32,y0为u32)。数据=[255,255,255];
//检查结束条件
如果x0==x1&&y0==y1{break};
//存储旧错误
err2=2*err;
//调整误差和起始位置
如果err2>-dx{err-=dy;x0+=sx;}
如果err2
输出:

作为添加厚度的基本形式,可以重复绘制具有一定偏移量的线。或者,绘制一个填充矩形,其中矩形的高度对应于所需线条的厚度


该项目中有一个添加抗锯齿线条绘制支持的问题:

除了上面的伟大答案之外:现在库中有对绘制线条和更多形状(甚至文本)的直接支持(另请参见其中的示例):


我创建了此函数的通用版本,可以使用
通用图像
像素
,因为我需要它在
Rgba
Rgb
图像中绘制线条:
extern crate image;

use image::RgbImage;

fn draw_line(img: &mut RgbImage, x0: i64, y0: i64, x1: i64, y1: i64) {

    // Create local variables for moving start point
    let mut x0 = x0;
    let mut y0 = y0;

    // Get absolute x/y offset
    let dx = if x0 > x1 { x0 - x1 } else { x1 - x0 };
    let dy = if y0 > y1 { y0 - y1 } else { y1 - y0 };

    // Get slopes
    let sx = if x0 < x1 { 1 } else { -1 };
    let sy = if y0 < y1 { 1 } else { -1 };

    // Initialize error
    let mut err = if dx > dy { dx } else {-dy} / 2;
    let mut err2;

    loop {
        // Set pixel
        img.get_pixel_mut(x0 as u32, y0 as u32).data = [255, 255, 255];

        // Check end condition
        if x0 == x1 && y0 == y1 { break };

        // Store old error
        err2 = 2 * err;

        // Adjust error and start position
        if err2 > -dx { err -= dy; x0 += sx; }
        if err2 < dy { err += dx; y0 += sy; }
    }

}

fn main() {
    let mut img = RgbImage::new(256, 256);

    draw_line(&mut img, 10, 10, 246, 128);
    draw_line(&mut img, 128, 10, 10, 246);

    img.save("output.png").unwrap();
}
extern crate image;
extern crate imageproc;

use image::{Rgb, RgbImage};
use imageproc::drawing::draw_line_segment_mut;

fn main() {
    let mut img = RgbImage::new(100, 100);
    draw_line_segment_mut(
        &mut img,
        (5f32, 5f32),              // start point
        (95f32, 95f32),            // end point
        Rgb([69u8, 203u8, 133u8]), // RGB colors
    );
    img.save("output.png").unwrap();
}