#dynamic-image #svg #png #file #convert

svg_to_png

Converts SVG to PNG and dynamic Image

1 unstable release

0.1.0 Oct 29, 2023

#6 in #dynamic-image


Used in leptos_image_optimizer

MIT license

15KB
272 lines

If you want to read Read me in English go to this Read me README

SVG to PNG

이 리포는 svg 파일을 png 로 바꾸어 저장 하거나 image crate 에 호환되는 Dynamic Image 타입을 만들기 위해서 생성한 리포 입니다.

Dependency

[dependencies]
image = { version = "0.24.7"}
rsvg = "0.4.0"
cairo-rs = "0.4.1"

cairo-rs 의 버전은 0.4.1 버전이상을 사용해야 합니다. 이는 rsvg 에서 사용하는 cairo-rs 버전이 0.4.1 이라 버전이 바뀌면 타입이 변하기 때문에 문제가 됩니다.

사용방법

https://github.com/jinseok9338/svg_to_png/assets/27854958/e2e3451e-8d92-43e1-8f15-aee097afca34


let handler = get_svg_handler(Path::new(TEST_FILE_PATH));
        assert_eq!(handler.is_ok(), true);
        let handler = handler.unwrap();
        println!("{:?}", handler);
        let surface = render_image(handler.width, handler.height, handler.handle, None);
        assert_eq!(surface.is_ok(), true);
        println!("{:?}", surface);
        let _ = save_png_to_path(&Path::new("./src/assets/example.png"), &surface.unwrap());

위와 같이 get_svg_handlerHandle 을 만든후에 render_image 를 통해서 ImageSurface 를 만든후 save_png_to_path 를 이용하여 png 파일을 저장 하면 된다.

let handler = get_svg_handler(Path::new(TEST_FILE_PATH));
        assert_eq!(handler.is_ok(), true);
        let handler = handler.unwrap();
        let surface = render_image(handler.width, handler.height, handler.handle, None);
        assert_eq!(surface.is_ok(), true);
        let image = make_surface_into_dynamic_image(&mut surface.unwrap());
        assert_eq!(image.is_ok(), true);

혹은 make_surface_into_dynamic_image 를 호출 하여서 DynamicImage 타입을 만들 수도 있다. → 이후 image crate 를 이용하여 webp 혹은 이미지 리사이징 등을 진행 할 수 있다.

추가 테스트 여러가지 svg 파일을 테스트 해보았습니다. (2023/10/29) -> 애니메이션은 동작하지 않습니다. webp 파일로 변환을 테스트 해보았습니다. (2023/10/29)

Dependencies

~16MB
~261K SLoC