Rust 在位图中绘制一条线(可能使用活塞)
我想在位图中画一条线,例如从像素(10,10)到像素(90,90)。该行必须具有特定的宽度 使用活塞图像,我能够绘制单个像素: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)
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();
}