imageproc icon indicating copy to clipboard operation
imageproc copied to clipboard

How to draw lines with different width?

Open SunDoge opened this issue 3 years ago • 2 comments

For example the thickness in opencv and linewidth in matplotlib.

SunDoge avatar Jan 05 '23 03:01 SunDoge

Doesn't look like it's implemented (really should be though).

Possible workarounds include:

  • A bunch of parallel line segments really close together
  • A polygon

https://docs.rs/imageproc/latest/imageproc/drawing/fn.draw_polygon.html https://docs.rs/imageproc/latest/imageproc/drawing/fn.draw_line_segment.html https://docs.rs/imageproc/latest/imageproc/drawing/fn.draw_antialiased_line_segment.html

willhansen avatar May 22 '23 04:05 willhansen

I agree that it is something that I would expect from a shape drawing function. It is an option in most tools, programmatic or GUIs.

I could try submitting a PR for it, but what would be the API? Would it be adding new functions suffixed by _with_thickness, or adding a parameter to the currently available functions (i.e. a breaking change)?

What about the offset of the thickness, should it always be a on a single side of the shape? If yes which side? Should it be on both side? If yes what side should thicker when the thickness is an odd number?

Assuming the addition of new functions suffixed by _with_thickness, with a one sided offset, a naive implementation for the hollow rectangle would look something like this

fn draw_hollow_rect_with_thichness<I>(
    image: &I,
    rect: Rect,
    color: I::Pixel,
    thickness: u16,
) -> Image<I::Pixel>
where
    I: GenericImage,
{
    let rect_x = rect.left();
    let rect_y = rect.top();
    let rect_width = rect.width();
    let rect_height = rect.height();
    let mut image_with_rectangle = drawing::draw_hollow_rect(image, rect, color);

    for offset in 0..thickness {
        let thickness_rect = Rect::at(rect_x - i32::from(offset), rect_y - i32::from(offset))
            .of_size(
                rect_width + 2 * u32::from(offset),
                rect_height + 2 * u32::from(offset),
            );
        drawing::draw_hollow_rect_mut(&mut image_with_rectangle, thickness_rect, color);
    }

    image_with_rectangle
}

WDYT?

SamyAB avatar Jan 28 '24 18:01 SamyAB