A Simple-to-use, cross-platform Rust Webcam Capture Library

Overview

nokhwa

Nokhwa(녹화): Korean word meaning "to record".

A Simple-to-use, cross-platform Rust Webcam Capture Library

Using nokhwa

Nokhwa can be added to your crate by adding it to your Cargo.toml:

[dependencies.nokhwa]
// TODO: replace the "*" with the latest version of `nokhwa`
version = "*"
// TODO: add some features
features = [""]

Most likely, you will only use functionality provided by the Camera struct. If you need lower-level access, you may instead opt to use the raw capture backends found at nokhwa::backends::capture::*.

Example

// set up the Camera
let mut camera = Camera::new(
    0, // index
    Some(CameraFormat::new_from(640, 480, FrameFormat::MJPEG, 30)), // format
    CaptureAPIBackend::AUTO, // what backend to use (let nokhwa decide for itself)
)
.unwrap();
// open stream
camera.open_stream().unwrap();
loop {
    let frame = camera.get_frame().unwrap();
    println!("{}, {}", frame.width(), frame.height());
}

They can be found in the examples folder.

Feature

The default feature includes nothing. Anything starting with input-* is a feature that enables the specific backend.

input-* features:

  • input-v4l: Enables the Video4Linux backend (linux)
  • input-uvc: Enables the libuvc backend (cross-platform)

Conversely, anything that starts with output-* controls a feature that controls the output of something (usually a frame from the camera)

output-* features:

  • output-wgpu: Enables the API to copy a frame directly into a wgpu texture.

You many want to pick and choose to reduce bloat.

Issues

If you are making an issue, please make sure that

  • It has not been made yet
  • Attach what you were doing, your environment, steps to reproduce, and backtrace. Thank you!

Contributing

Contributions are welcome!

  • Please rustfmt all your code and adhere to the clippy lints (unless necessary not to do so)
  • Please limit use of unsafe
  • All contributions are under the MPL 2.0 license unless otherwise specified

Minimum Service Rust Version

nokhwa may build on older versions of rustc, but there is no guarantee except for the latest stable rust.

Comments
  • Example crashes on MacOS

    Example crashes on MacOS

    Hi! I tried to run the example on my MacBook, but encountered following error:

    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: CouldntOpenDevice("Device at 0 not found")', src/main.rs:10:6
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    
    bug 
    opened by teenjuna 23
  • chore: bring example up to date with code

    chore: bring example up to date with code

    Hey there, I made a quick PR to bring the threaded example in sync with the actual code. I also added a github action so it stays in sync, I hope that's okay :)

    When I run this I get

         Running `/Users/danielschmidt/fun/nokhwa/target/debug/threaded-capture`
    CameraInfo { human_name: "FaceTime HD Camera", description: "Apple Inc.: FaceTime HD Camera - AVCaptureDeviceTypeBuiltInWideAngleCamera, Unspecified f0", misc: "EAB7A68F-EC2B-4487-AADF-D8A91C1CB782", index: Index(0) }
    thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: OpenDeviceError("0", "Not Found")', examples/threaded-capture/src/main.rs:39:6
    note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
    

    Is this expected in the current RC state?

    opened by DanielMSchmidt 17
  • Error when running 0.10 example with AVFoundation

    Error when running 0.10 example with AVFoundation

    OS: 12.3.1 (21E258) Machine: MacBook Pro (13-inch, M1, 2020) rustc: 1.61.0 (fe5b13d68 2022-05-18)

    I execute this command:

    nokhwa/examples/capture on  senpai via 🦀 v1.61.0
    ❯ cargo run --features "input-avfoundation"
    

    and it gives 14 errors:

     cargo run --features "input-avfoundation"
    
       Compiling nokhwa v0.10.0 (/Users/mo/dev/nokhwa)
    error[E0412]: cannot find type `Output` in module `crate::pixel_format`
       --> /Users/mo/dev/nokhwa/src/backends/capture/avfoundation.rs:275:50
        |
    275 |     ) -> Result<ImageBuffer<crate::pixel_format::Output, Vec<u8>>, NokhwaError> {
        |                                                  ^^^^^^ not found in `crate::pixel_format`
        |
    help: consider importing this struct
        |
    17  | use std::process::Output;
        |
    
    error[E0425]: cannot find value `cp` in this scope
       --> /Users/mo/dev/nokhwa/src/camera.rs:454:44
        |
    454 |                           Ok(cap) => Some(Ok(cp.into())),
        |                                              ^^ help: a local variable with a similar name exists: `cap`
    ...
    549 | / cap_impl_fn! {
    550 | |     // (GStreamerCaptureDevice, new, feature = "input-gst", gst),
    551 | |     (OpenCvCaptureDevice, new_autopref, feature = "input-opencv", opencv),
    552 | |     // (UVCCaptureDevice, create, feature = "input-uvc", uvc),
    ...   |
    555 | |     (AVFoundationCaptureDevice, new, all(feature = "input-avfoundation", any(target_os = "macos", target_os = "ios")), avfoundation)
    556 | | }
        | |_- in this macro invocation
        |
        = note: this error originates in the macro `cap_impl_fn` (in Nightly builds, run with -Z macro-backtrace for more info)
    
    error[E0412]: cannot find type `MSMF` in this scope
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:37:5
       |
    37 |     MSMF,
       |     ^^^^ not found in this scope
       |
    help: there is an enum variant `crate::BackendsEnum::MSMF`; try using the variant's enum
       |
    37 |     crate::BackendsEnum,
       |     ~~~~~~~~~~~~~~~~~~~
    
    error[E0412]: cannot find type `AVF` in this scope
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:38:5
       |
    38 |     AVF,
       |     ^^^ not found in this scope
       |
    help: there is an enum variant `crate::BackendsEnum::AVF`; try using the variant's enum
       |
    38 |     crate::BackendsEnum,
       |     ~~~~~~~~~~~~~~~~~~~
    
    error[E0412]: cannot find type `V4L2` in this scope
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:39:5
       |
    39 |     V4L2,
       |     ^^^^ not found in this scope
       |
    help: there is an enum variant `crate::BackendsEnum::V4L2`; try using the variant's enum
       |
    39 |     crate::BackendsEnum,
       |     ~~~~~~~~~~~~~~~~~~~
    
    error[E0412]: cannot find type `OCV` in this scope
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:40:5
       |
    40 |     OCV,
       |     ^^^ not found in this scope
       |
    help: there is an enum variant `crate::BackendsEnum::OCV`; try using the variant's enum
       |
    40 |     crate::BackendsEnum,
       |     ~~~~~~~~~~~~~~~~~~~
    
    error[E0412]: cannot find type `MSMF` in this scope
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:50:1
       |
    50 | #[enum_dispatch(BackendsEnum)]
       | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
       |
       = note: this error originates in the attribute macro `enum_dispatch` (in Nightly builds, run with -Z macro-backtrace for more info)
    help: there is an enum variant `crate::BackendsEnum::MSMF`; try using the variant's enum
       |
    50 | crate::BackendsEnum
       |
    
    error[E0412]: cannot find type `AVF` in this scope
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:50:1
       |
    50 | #[enum_dispatch(BackendsEnum)]
       | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
       |
       = note: this error originates in the attribute macro `enum_dispatch` (in Nightly builds, run with -Z macro-backtrace for more info)
    help: there is an enum variant `crate::BackendsEnum::AVF`; try using the variant's enum
       |
    50 | crate::BackendsEnum
       |
    
    error[E0412]: cannot find type `V4L2` in this scope
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:50:1
       |
    50 | #[enum_dispatch(BackendsEnum)]
       | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
       |
       = note: this error originates in the attribute macro `enum_dispatch` (in Nightly builds, run with -Z macro-backtrace for more info)
    help: there is an enum variant `crate::BackendsEnum::V4L2`; try using the variant's enum
       |
    50 | crate::BackendsEnum
       |
    
    error[E0412]: cannot find type `OCV` in this scope
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:50:1
       |
    50 | #[enum_dispatch(BackendsEnum)]
       | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not found in this scope
       |
       = note: this error originates in the attribute macro `enum_dispatch` (in Nightly builds, run with -Z macro-backtrace for more info)
    help: there is an enum variant `crate::BackendsEnum::OCV`; try using the variant's enum
       |
    50 | crate::BackendsEnum
       |
    
    error[E0412]: cannot find type `ControlValue` in this scope
       --> /Users/mo/dev/nokhwa/src/utils.rs:984:40
        |
    984 |     pub fn set_value(&mut self, value: ControlValue) -> Result<(), NokhwaError> {
        |                                        ^^^^^^^^^^^^ not found in this scope
    
    error[E0412]: cannot find type `ControlValue` in this scope
       --> /Users/mo/dev/nokhwa/src/utils.rs:994:36
        |
    994 |     pub fn with_value(self, value: ControlValue) -> Result<Self, NokhwaError> {
        |                                    ^^^^^^^^^^^^ not found in this scope
    
    error[E0574]: expected struct, variant or union type, found enum `ControlDescription`
       --> /Users/mo/dev/nokhwa/src/utils.rs:997:12
        |
    997 |         Ok(ControlDescription {
        |            ^^^^^^^^^^^^^^^^^^ not a struct, variant or union type
    
    warning: unused import: `nokhwa_initialize`
      --> /Users/mo/dev/nokhwa/src/backends/capture/avfoundation.rs:18:33
       |
    18 |     mjpeg_to_rgb, nokhwa_check, nokhwa_initialize, yuyv422_to_rgb, CameraControl, CameraFormat,
       |                                 ^^^^^^^^^^^^^^^^^
       |
       = note: `#[warn(unused_imports)]` on by default
    
    warning: unused import: `std::process::Output`
      --> /Users/mo/dev/nokhwa/src/backends/capture/avfoundation.rs:27:5
       |
    27 | use std::process::Output;
       |     ^^^^^^^^^^^^^^^^^^^^
    
    warning: unused imports: `any::Any`, `ops::Deref`
      --> /Users/mo/dev/nokhwa/src/backends/capture/avfoundation.rs:28:11
       |
    28 | use std::{any::Any, borrow::Borrow, borrow::Cow, collections::HashMap, ops::Deref};
       |           ^^^^^^^^                                                     ^^^^^^^^^^
    
    warning: unused import: `pixel_format::PixelFormat`
      --> /Users/mo/dev/nokhwa/src/camera.rs:18:21
       |
    18 |     buffer::Buffer, pixel_format::PixelFormat, BackendsEnum, CameraControl, CameraFormat,
       |                     ^^^^^^^^^^^^^^^^^^^^^^^^^
    
    warning: unused import: `frame_formats`
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:19:5
       |
    19 |     frame_formats,
       |     ^^^^^^^^^^^^^
    
    warning: unused imports: `RgbaImage`, `buffer::ConvertBuffer`
      --> /Users/mo/dev/nokhwa/src/camera_traits.rs:26:13
       |
    26 | use image::{buffer::ConvertBuffer, ImageBuffer, RgbaImage};
       |             ^^^^^^^^^^^^^^^^^^^^^               ^^^^^^^^^
    
    error[E0204]: the trait `Copy` may not be implemented for this type
       --> /Users/mo/dev/nokhwa/src/utils.rs:941:10
        |
    941 | #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq)]
        |          ^^^^
    ...
    945 |     name: String,
        |     ------------ this field does not implement `Copy`
    946 |     value: ControlDescription,
        |     ------------------------- this field does not implement `Copy`
    947 |     flag: Vec<KnownCameraControlFlag>,
        |     --------------------------------- this field does not implement `Copy`
        |
        = note: this error originates in the derive macro `Copy` (in Nightly builds, run with -Z macro-backtrace for more info)
    
    Some errors have detailed explanations: E0204, E0412, E0425, E0574.
    For more information about an error, try `rustc --explain E0204`.
    warning: `nokhwa` (lib) generated 6 warnings
    error: could not compile `nokhwa` due to 14 previous errors; 6 warnings emitted
    

    I'm new to Rust and after digging for an hour didn't know what I should do. Thanks!

    wontfix AVFoundation 
    opened by morajabi 12
  • Can't get frame from camera

    Can't get frame from camera

    I can't get frame from camera, it says

    ReadFrameError("Input/output error (os error 5)")'
    

    after like 15-30 seconds on this line:

    let frame = camera.frame().unwrap();
    

    I'm on Linux and specified v4l backend

    bug P2 V4L2 
    opened by Meister1593 11
  • Get error Frame Cow Too Small from frame_to_buffer

    Get error Frame Cow Too Small from frame_to_buffer

    Try to get RGBA image from camera, but get error: thread 'main' panicked at 'called Result::unwrap() on an Err value: ReadFrameError("Frame Cow Too Small")'

    let mut camera = nokhwa::Camera::new(
            0, // index
            Some(nokhwa::CameraFormat::new_from(640, 480, nokhwa::FrameFormat::MJPEG, 30)), // format
        )
        .unwrap();
    
    camera.open_stream().unwrap();
    
    let mut buffer2: Vec<u8> = vec![0; camera.min_buffer_size(true)];
    
    camera.frame_to_buffer(&mut buffer2, true).unwrap();
    

    As I understand, I should receive 6404804 bytes. But when I increase the size of a vector, I get this error as well.

    bug 
    opened by sdongles 11
  • Wrong Platform - Not Selected Error on Example, Windows 10

    Wrong Platform - Not Selected Error on Example, Windows 10

    Hi,

    I've ended up copy-pasting the code from the example to make sure it's not something I introduced by mistake.

    Same behaviour for 0.6.0 and 0.7.0.

    I am not able to figure out what it is, just wondering if it is an access problem, but not finding a way to fix it.

    I got logitech UVC webcam, windows 10 Home, Gstreamer and OpenCV installed, not from WSL, admin cmd, made sure python from the same terminal could capture from the webcam with opencv-for-python.

    Does it sound like a classic rust - Windows 10 problem you know of or something?

    bug question 
    opened by DataScienceLeadJr 10
  • Can't use controls on windows

    Can't use controls on windows

    All requests to consult camera parameters (controls) are returning an error using input-msmf. I'm still trying to discover what is the problem...

    I'm getting:

    Err(GUIDSetError("MEDIA_FOUNDATION_FIRST_VIDEO_STREAM", "MF_MEDIASOURCE_SERVICE", "O objeto não oferece suporte ao serviço especificado."))
    

    Probably from here:

    pub fn control(&self, control: MediaFoundationControls) -> Result<MFControl, BindingError> {
                let media_source = unsafe {
                    let mut receiver: MaybeUninit<IMFMediaSource> = MaybeUninit::uninit();
                    let mut ptr_receiver = receiver.as_mut_ptr();
                    if let Err(why) = self.source_reader.GetServiceForStream(
                        MEDIA_FOUNDATION_FIRST_VIDEO_STREAM,
                        &MF_MEDIASOURCE_SERVICE,
                        &IMFMediaSource::IID,
                        (&mut ptr_receiver as *mut *mut IMFMediaSource).cast::<*mut std::ffi::c_void>(),
                    ) {
                        return Err(BindingError::GUIDSetError(
                            "MEDIA_FOUNDATION_FIRST_VIDEO_STREAM".to_string(),
                            "MF_MEDIASOURCE_SERVICE".to_string(),
                            why.to_string(),
                        ));
                    }
                    receiver.assume_init()
                };
    
    bug P2 MediaFoundation 
    opened by quartzo 8
  • Capture example fails on invalid color format

    Capture example fails on invalid color format

    OS: MacOS 12.3.1 Hardware: Apple Macbook Pro (14 inch, 2021), M1 Pro Chip Rust Version: rustc 1.62.0 (a8314ef7d 2022-06-27) Nokhwa Commit: 5a8d9c3 (0.9.4)

    Example invocation:

    cargo run --release --features "input-avfoundation" -- --format YUYV
    

    Output:

    thread '<unnamed>' panicked at 'called `Result::unwrap()` on an `Err` value: GetPropertyError { property: "875704438", error: "Invalid Value" }', src/main.rs:195:88
    stack backtrace:
       0: rust_begin_unwind
                 at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/std/src/panicking.rs:584:5
       1: core::panicking::panic_fmt
                 at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/core/src/panicking.rs:142:14
       2: core::result::unwrap_failed
                 at /rustc/a8314ef7d0ec7b75c336af2c9857bfaf43002bfc/library/core/src/result.rs:1785:5
    note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
    Thread terminated, closing!
    

    875704438 corresponds to a FourCC of 420v, or CV420YpCbCr8BiPlanarVideoRange

    This error comes from this match block:

    https://github.com/l1npengtul/nokhwa/blob/bd8e78134a123dc5fd3685264468ad27e99ddb17/nokhwa-bindings-macos/src/lib.rs#L862-L871

    I suppose this is due to the newer facetime camera in the 2021 macbook pros?

    If it's just a matter of adding support for an extra color format then I'd be happy to take a crack at it. Let me know if you need any help testing on apple hardware, I have a macbook pro 2014 (intel), macbook pro 2021 (M1 pro), and an M1 mac mini.

    P2 AVFoundation 
    opened by bschwind 8
  • Poor performance with v4l backend

    Poor performance with v4l backend

    I'm trying to port a library I wrote from my custom V4L2 bindings (https://github.com/SludgePhD/LinuxVideo) to nokhwa and am seeing reduced performance:

    [2022-05-01T12:53:43Z DEBUG zaru::webcam] trying #3 'Logitech BRIO' (Video4Linux Device @ /dev/video3)
    [2022-05-01T12:53:43Z INFO  zaru::webcam] started stream at 1280x720@90Hz
    [2022-05-01T12:53:44Z DEBUG zaru::timer] webcam: 3 FPS (dequeue: 3x333.5ms, decode: 3x6.8ms)
    [2022-05-01T12:53:45Z DEBUG zaru::timer] webcam: 29 FPS (dequeue: 29x25.3ms, decode: 29x9.8ms)
    [2022-05-01T12:53:46Z DEBUG zaru::timer] webcam: 29 FPS (dequeue: 29x25.1ms, decode: 29x9.8ms)
    [2022-05-01T12:53:47Z DEBUG zaru::timer] webcam: 29 FPS (dequeue: 29x22.9ms, decode: 29x11.7ms)
    [2022-05-01T12:53:48Z DEBUG zaru::timer] webcam: 29 FPS (dequeue: 29x28.3ms, decode: 29x6.6ms)
    [2022-05-01T12:53:49Z DEBUG zaru::timer] webcam: 29 FPS (dequeue: 29x28.5ms, decode: 29x6.6ms)
    [2022-05-01T12:53:50Z DEBUG zaru::timer] webcam: 29 FPS (dequeue: 29x28.1ms, decode: 29x6.8ms)
    

    dequeue is the average time taken by camera.frame_raw(), decode is the time mozjpeg needs to decode the JPEG frame (which I do by hand, hence frame_raw()). The result of this is correct, and the decode times remained about the same, but the performance of dequeue is a lot worse than before (and much lower than what the webcam can deliver or what was requested).

    For comparison, with LinuxVideo I have no problems running at 86 FPS, which I think is as fast as the webcam outputs frames when requesting 90 Hz. Note that LinuxVideo sidesteps libv4l and directly calls the device ioctls. The dequeue time is essentially completely spent blocking on the device read.

    It could be that libv4l does some expensive conversion, or that something with setting the frame rate is going wrong (though camera.frame_rate() does correctly return 90).

    This is with nokhwa 0.9.4, not latest git, but I don't see much that could affect performance (EDIT: now tested with git, same behavior).

    (side note, I have tried the gstreamer backend instead of input-v4l, but it fails with a nondescript UnsupportedOperationError(Auto))

    wontfix 
    opened by SludgePhD 8
  • Does not build on Mac

    Does not build on Mac

    Hi, thank you for maintaining this crate!

    It seems there is symbol(s) not found for architecture arm64 when building on a MacBook with an M1 processor (update: the same issue is encountered while trying to build on x86-64 mac, so CPU architecture does not matter here).

    Here is the code I use:

    use {
        std::{thread::sleep, time::Duration},
        nokhwa::{Camera, nokhwa_initialize, query},
    };
    
    fn main() {
        nokhwa_initialize(|result| {
            println!("on_complete: {}, query: {:?}", result, query()); 
            let camera = Camera::new(1, None).unwrap();
            println!("camera: {:?}", camera.info());
        });
        sleep(Duration::from_secs(10));
    }
    

    Cargo.toml:

    [package]
    name = "nokhwa-testing"
    version = "0.1.0"
    edition = "2021"
    
    [dependencies]
    nokhwa = { version = "0.9.4", features = ["input-avfoundation"] }
    

    Here is a linker error I encounter:

    error: linking with `cc` failed: exit status: 1
      |
      = note: "cc" "-arch" "arm64" "/var/folders/k8/tc8kf6997r9gwl156j5b0g1h0000gn/T/rustcad2hl8/symbols.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.11b26thxr2zkmh75.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.14ju9lp2uv7xhil7.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.1isbi16a1tjg7o5f.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.3157rqi1un27yfph.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.339giqviijkbdou6.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.3kwn36whf96wn4nw.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.3oypbmz1qu6dv53c.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.3p3ucd0uz6i9kmmt.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.3q1aqfnimpcwrq6k.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.3qmqqgs3zmfmeqas.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.3wb3sk0nl9iivagx.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.417cdvo4hhcqac1g.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.49s8netqzp6lphje.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.4zqfqkynbefkt7uy.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.51smx5yvu2pz9xip.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.54eb0f5x3en2jk52.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.8wxashage992bxm.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.nfdq08phd3fnq4o.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.x7vl8kune1u8ikw.rcgu.o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8.3yj7iby9c11nidld.rcgu.o" "-L" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps" "-L" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/build/mozjpeg-sys-f582892835282850/out" "-L" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/build/mozjpeg-sys-f582892835282850/out" "-L" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/build/objc_exception-c7958e843b8e62bd/out" "-L" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libnokhwa-1a079bdbbb5589a9.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libmozjpeg-6634d948351acdd4.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/librgb-480af82697f3e438.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libfallible_collections-3309b696366dad20.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libhashbrown-1d8e74aeb478f341.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libahash-5f759626124e5b0b.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libonce_cell-4e22a751c4ad0e53.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libarrayvec-efc691a55c0983c5.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libmozjpeg_sys-09fe7e07ea2f7db4.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libnokhwa_bindings_macos-4cd999170c2a10bf.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libflume-ed4efa3fd1d7557e.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libspin-2407881c60aa70b0.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/liblock_api-7fbb72b6cfc1b0c6.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libscopeguard-eb1e61010332a1cf.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libpin_project-a98907d1fcb05856.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libfutures_sink-40b09e67990431db.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libfutures_core-1b3a27dc641a732a.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libnanorand-a27a2d340e69126f.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libgetrandom-732ae10a5aefa5d2.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libdashmap-a83262b3454e3e27.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libnum_cpus-3b913b51fe59fbf0.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcfg_if-e6509c5f025d8702.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcocoa_foundation-f4d5900a80da637b.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libforeign_types-b1a73fdbd94e948a.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libforeign_types_shared-b2b813634eacbc55.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcore_graphics_types-2e141c6049806b3c.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcore_foundation-8928320c492b4635.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcore_foundation_sys-a98884409e1a2efe.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libbitflags-295066ef4f1a08fb.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libblock-54d07849328ebd85.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcore_media_sys-06f8f5185bcc4631.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcore_foundation_sys-d16b009260a549e9.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcfg_if-504e5b6598191998.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libthiserror-0b5d3046e86037a8.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/liblazy_static-f75dab69ff4510ec.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libobjc-0959b0f3a1d78466.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libobjc_exception-08e7865472ccbbe2.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libmalloc_buf-36827c8d724d6279.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/liblibc-1b5ce4b92aa38abf.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libimage-79c28f91dd58bf9a.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libcolor_quant-22192260062230e7.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libnum_iter-7d6461ad6c5f1c6d.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libbytemuck-88e115a31e194307.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libnum_rational-84c9edafed28713c.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libnum_integer-824e1dd12fc03d2b.rlib" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/libnum_traits-4b4376f67277d6cf.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libstd-af3f3292c66eb7cc.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libpanic_unwind-bc47a5a819240eac.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libobject-5fa6d29c50391a26.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libmemchr-9f34659cc49c55cf.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libaddr2line-0ca0691d5024e0e7.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libgimli-8b09daf3a02ae894.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_demangle-c8e6e1ad4a56d084.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libstd_detect-cc5bb2a5896a5a35.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libhashbrown-ba2ca40bd5b846ac.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libminiz_oxide-eddbbfd8a1284efa.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libadler-0d5fdbc7da87a8dd.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_std_workspace_alloc-94febd0ddea042d3.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libunwind-9231f6f457586171.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcfg_if-3e833ccda9a92f6a.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/liblibc-e2416b3132f6fa90.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/liballoc-a8cb71066dca08ca.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/librustc_std_workspace_core-95a7e52c78a3fba1.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcore-dd6de681850a671c.rlib" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib/libcompiler_builtins-aa21927f5da4d4a2.rlib" "-framework" "CoreMedia" "-framework" "AVFoundation" "-framework" "Foundation" "-framework" "CoreGraphics" "-framework" "CoreFoundation" "-lSystem" "-framework" "CoreMedia" "-framework" "CoreFoundation" "-lobjc" "-liconv" "-lSystem" "-lresolv" "-lc" "-lm" "-liconv" "-L" "/Users/nikitavbv/.rustup/toolchains/nightly-aarch64-apple-darwin/lib/rustlib/aarch64-apple-darwin/lib" "-o" "/Users/nikitavbv/dev/nokhwa-testing/target/debug/deps/nokhwa_testing-ee6d6ca36fb7e9d8" "-Wl,-dead_strip" "-nodefaultlibs"
      = note: Undefined symbols for architecture arm64:
                "_CVPixelBufferLockBaseAddress", referenced from:
                    _$LT$nokhwa_bindings_macos..avfoundation..CALLBACK_CLASS$u20$as$u20$core..ops..deref..Deref$GT$::deref::__static_ref_initialize::capture_out_callback::hbcd689a01a46737c in libnokhwa_bindings_macos-4cd999170c2a10bf.rlib(nokhwa_bindings_macos-4cd999170c2a10bf.nokhwa_bindings_macos.51d10249-cgu.1.rcgu.o)
                "_CVPixelBufferGetPixelFormatType", referenced from:
                    _$LT$nokhwa_bindings_macos..avfoundation..CALLBACK_CLASS$u20$as$u20$core..ops..deref..Deref$GT$::deref::__static_ref_initialize::capture_out_callback::hbcd689a01a46737c in libnokhwa_bindings_macos-4cd999170c2a10bf.rlib(nokhwa_bindings_macos-4cd999170c2a10bf.nokhwa_bindings_macos.51d10249-cgu.1.rcgu.o)
                "_CVPixelBufferGetBaseAddress", referenced from:
                    _$LT$nokhwa_bindings_macos..avfoundation..CALLBACK_CLASS$u20$as$u20$core..ops..deref..Deref$GT$::deref::__static_ref_initialize::capture_out_callback::hbcd689a01a46737c in libnokhwa_bindings_macos-4cd999170c2a10bf.rlib(nokhwa_bindings_macos-4cd999170c2a10bf.nokhwa_bindings_macos.51d10249-cgu.1.rcgu.o)
                "_CVPixelBufferGetDataSize", referenced from:
                    _$LT$nokhwa_bindings_macos..avfoundation..CALLBACK_CLASS$u20$as$u20$core..ops..deref..Deref$GT$::deref::__static_ref_initialize::capture_out_callback::hbcd689a01a46737c in libnokhwa_bindings_macos-4cd999170c2a10bf.rlib(nokhwa_bindings_macos-4cd999170c2a10bf.nokhwa_bindings_macos.51d10249-cgu.1.rcgu.o)
                "_CVPixelBufferUnlockBaseAddress", referenced from:
                    _$LT$nokhwa_bindings_macos..avfoundation..CALLBACK_CLASS$u20$as$u20$core..ops..deref..Deref$GT$::deref::__static_ref_initialize::capture_out_callback::hbcd689a01a46737c in libnokhwa_bindings_macos-4cd999170c2a10bf.rlib(nokhwa_bindings_macos-4cd999170c2a10bf.nokhwa_bindings_macos.51d10249-cgu.1.rcgu.o)
              ld: symbol(s) not found for architecture arm64
              clang: error: linker command failed with exit code 1 (use -v to see invocation)
    
    
    error: could not compile `nokhwa-testing` due to previous error
    

    Any ideas on a possible workaround? Thank you!

    bug P2 AVFoundation blocked 
    opened by nikitavbv 7
  • Fixed in-buffer frame decoding

    Fixed in-buffer frame decoding

    • Dropped UVC backend
    • Updated mozjpeg to a forked 0.9.1 version supporting in-buffer decoding
      • Ideally a PR should be done to mozjpeg-rust to mainline this change
    • Modified existing decoding methods to take rgba as a parameter
      • yuyv422_to_rgb888 / yuyv422_to_rgba => yuyv422_to_rgb
      • mozjpeg_to_rgb888 / mozjpeg_to_rgba => mozjpeg_to_rgb
    • Added in-buffer decoding methods
      • buf_yuyv422_to_rgb
      • buf_mozjpeg_to_rgb
      • Note: the aforementioned existing decoding methods allocate a sizable Vec then call into those new methods.
    • Simplified code in some places
    • Removed ^version in Cargo.toml dependencies as ^ is always implied
    cherry-pick 
    opened by OtaK 7
  • 0.11 Roadmap

    0.11 Roadmap

    • [ ] FrameFormat Rework, Again
      • [ ] Support Every FourCC in Existance, at least in the Enum
      • [ ] Seperate FrameFormat, RGB, and Decoder
        • [ ] e.g. MJPEGDecoder decodes into RGB, GRAY, BRG, 10bit, etc..
        • [ ] This will allow for user-definable decoders
    • [ ] Re-write WASM backend
      • [ ] Deprecate JSCamera and instead use BrowserCamera accessible from Camera
    • [ ] AsyncCamera Support, Callback Camera but with Async instead of Threads
      • [ ] New Trait to describe Async-able Backends
      • [ ] V4L2: Async
      • [ ] AVFoundation: Wait on Callback
      • [ ] WASM: Directly pass JSFuture
      • [ ] MSMF: Use Async Capture
    • [ ] FFMPEG Support
    • [ ] Support HDR, maybe (if i get a hold of one)
    opened by l1npengtul 0
  • Wrong colors in areas with high or low light

    Wrong colors in areas with high or low light

    OS: Windows 11 22H2 Camera: Name: AI Front Camera, Description: MediaFoundation Camera, Extra: \\?\display#qcom_avstream_8280_lenv#3&98d97ee&1&uid32768#{e5323777-f976-4f5b-9b55-b94699c46e44}\{4faeafd4-041b-4e46-85fd-400473891182}, Index: 0 (webcam of a Lenovo X13s) Backend: input-native

    I've been trying out the capture example, which I would assume to produce correct images out of the box. However, with my webcam I get correct colors in medium-light areas, but wrong colors in high or low light areas.

    See the below two images, the first taken with cargo run -- single 0 img_test.png AbsoluteHighestResolution, the second with Window's Camera app.

    img_test WIN_20221222_16_24_12_Pro

    This looks like an HDR issue of some kind, but I'm not sure how to go about solving it.

    opened by leofidus 1
  • How to use nokhwa together with iced

    How to use nokhwa together with iced

    Hi there 👋

    I'm trying to use nokhwa (built from this main branch) to show my webcam video in an iced application. I am pretty new to this ecosystem, so sorry if this is a dumb question, but how do I use the camera output with the image widget of iced.

    My application looks like this:

    use iced::widget::{column, image, text};
    use iced::{executor, Subscription};
    use iced::{Alignment, Application, Command, Element, Settings, Theme};
    use nokhwa::pixel_format::RgbFormat;
    use nokhwa::utils::{ApiBackend, CameraInfo, RequestedFormat, RequestedFormatType};
    use nokhwa::{query, Camera};
    
    // TODO: set these via environment variables
    const CAMERA_QUERY_INTERVAL: u64 = 2000;
    
    pub fn main() -> iced::Result {
        MediaHub::run(Settings::default())
    }
    
    struct MediaHub {
        cameras: Box<Vec<CameraInfo>>,
    }
    
    #[derive(Debug, Clone)]
    enum Message {
        CamerasListed(Box<Vec<CameraInfo>>),
    }
    
    fn query_all_cameras() -> Box<Vec<CameraInfo>> {
        Box::new(query(ApiBackend::Auto).unwrap())
    }
    
    impl Application for MediaHub {
        type Message = Message;
        type Executor = executor::Default;
        type Flags = ();
        type Theme = Theme;
    
        fn new(_flags: ()) -> (Self, Command<Self::Message>) {
            (
                Self {
                    cameras: query_all_cameras(),
                },
                Command::none(),
            )
        }
    
        fn update(&mut self, message: Message) -> Command<Self::Message> {
            match message {
                Message::CamerasListed(new_cams) => self.cameras = new_cams,
            }
            Command::none()
        }
    
        fn subscription(&self) -> Subscription<Message> {
            iced::time::every(std::time::Duration::from_millis(CAMERA_QUERY_INTERVAL))
                .map(|_| Message::CamerasListed(query_all_cameras()))
        }
    
        fn title(&self) -> String {
            String::from("MediaHub - Iced")
        }
    
        fn view(&self) -> Element<Message> {
            if self.cameras.len() > 0 {
                let camera_info = self
                    .cameras
                    .iter()
                    .map(|cam| cam.human_name())
                    .collect::<Vec<String>>()
                    .join(", ");
    
                let requested = RequestedFormat::new(RequestedFormatType::AbsoluteHighestFrameRate);
    
                let cam = Camera::new(nokhwa::utils::CameraIndex::Index(0), requested).unwrap();
                let frame = cam.frame().unwrap().decode_image().unwrap();
    
                let img = image::Handle::from_pixels(frame.width(), frame.height(), frame); // the last argument is wrong, it throws an error
    
                column![text(camera_info).size(50), image::viewer(img)]
                    .padding(20)
                    .align_items(Alignment::Center)
                    .into()
            } else {
                column![text("No camera found").size(50)]
                    .padding(20)
                    .align_items(Alignment::Center)
                    .into()
            }
        }
    }
    
    

    I can contribute an example for this integration if you like :)

    opened by DanielMSchmidt 2
  • is there a plan to provide a python lib of nokhwa

    is there a plan to provide a python lib of nokhwa

    hello, i want to use nokhwa to capture images from usb camera on windows, as the opencv didn't support MSMF backends well i found this lib based on nokhwa provided a python lib, yet it did not support control settings until now. i wonder is it possible to use nokhwa in python in the future? i think it will be more popular than the opencv-python or pycamera, which can not compare nokhwa on options abundance and stability

    enhancement help wanted P4 
    opened by zhusihan-python 1
Releases(0.10.3)
Owner
null
A cross platform reloading image viewer combined with a command executor

Watchout A cross platform reloading image viewer combined with a command executor. Watchout will do any of the following: Run a command when any file

Benedikt Terhechte 6 Oct 7, 2022
A cross-platform tool for embedding GPS data into photographs

nya-exif 中文 | English 介绍 nya-exif 是一个用于匹配照片 GPS 信息, 并写入文件 EXIF 信息的工具, 支持 JPEG 和 PNG 及各大相机厂商的主流RAW格式. 本工具基于 Rust 编写, 支持全平台使用 Features 支持 JPEG 和 PNG 及各大

Lyn Chen 32 Nov 16, 2023
A simple steganography library written in rust

steganography A stable steganography library written in rust Crates.io Usage Add the following to the Cargo.toml in your project: [dependencies] stega

Teodor Voinea 79 Dec 9, 2022
Use free svg icons in your Dioxus projects easily with dioxus-free-icons.

dioxus-free-icons Use free svg icons in your Dioxus projects easily with dioxus-free-icons. More information about this crate can be found in the crat

Daiki Nishikawa 16 Jan 2, 2023
A simple image average color extractor written in 🦀 Rust

A simple image average color extractor written in ?? Rust

Victor Aremu 3 Sep 23, 2021
A simple command-line utility (and Rust crate!) for converting from a conventional image file (e.g. a PNG file) into a pixel-art version constructed with emoji

EmojiPix This is a simple command-line utility (and Rust crate!) for converting from a conventional image file (e.g. a PNG file) into a pixel-art vers

Michael Milton 22 Dec 6, 2022
A Simple Image to Ascii converter in Rust

Image to Ascii A Simple Image to Ascii converter in Rust Brief ?? In my way to learn Rust i decided to make this converter. Challenges ?? new to Rust

WasixXD 7 Sep 16, 2022
PixelWorldProxy - Simple Pixel World Proxy made in Rust.

PixelWorldProxy Simple Pixel World Proxy made in Rust. Feature Safe and fast Support subserver switching Usage Clone the repository: git clone https:/

null 3 Jan 5, 2022
Simple CLI program to generate zoomable tiled images

zoomtiler Simple CLI program to generate deepzoom zoomable tiled images. The input can either be a single image or multiple images of the same height,

Matthieu Pizenberg 3 Mar 14, 2022
Simple image metadata scrubber. Will remove EXIF, XMP and IPTC metadata.

Simple image metadata scrubber. Will remove EXIF, XMP and IPTC metadata.

Jae Lo Presti 12 Nov 29, 2022
Simple image resizer/cropper API

Simple image resizer/cropper API. This is a Rust ?? port of the following article on the Deno Blog: Build a Simple Image Resizing API in less than 100

Enrique Mejías 5 Mar 2, 2023
A Rust library for calculating perceptual hash values of images

img_hash Now builds on stable Rust! (But needs nightly to bench.) A library for getting perceptual hash values of images. Thanks to Dr. Neal Krawetz f

Austin Bonander 264 Dec 9, 2022
Face detection library for the Rust programming language

Rustface SeetaFace detection library for the Rust programming language Example of demo program output SEETAFACE C++ – Github repository for the origin

Andrei Tomashpolskiy 323 Dec 27, 2022
😱 Dead fast thumbnail library for browser and NodeJs! Built with Rust 🦀 and WebAssembly 🕸

thumbo-core ?? Dead fast thumbnail library for browser and NodeJs Built with Rust ?? & WebAssembly ?? ?? About thumbo-core is a thubnail library for b

Victor Aremu 12 Dec 2, 2022
Rust library for fast image resizing with using of SIMD instructions.

fast_image_resize Rust library for fast image resizing with using of SIMD instructions. CHANGELOG Supported pixel formats and available optimisations:

Kirill Kuzminykh 115 Jan 5, 2023
PNG decoding and encoding library in pure Rust

PNG Decoder/Encoder PNG decoder/encoder in pure Rust. It contains all features required to handle the entirety of the PngSuite by Willem van Schack. p

image-rs 247 Dec 25, 2022
An advanced image processing library for Rust.

ImageProc Maintainers: @chyh1990 Note: this project is under active depvelopment, API may change! imageproc is a advanced image proccessing library fo

Chen Yuheng 97 Oct 18, 2022
Rust library to get image size and format without loading/decoding

imageinfo-rs Rust library to get image size and format without loading/decoding. The imageinfo don't get image format by file ext name, but infer by f

xiaozhuai, Weihang Ding 47 Dec 30, 2022
Image operation rust library

Image operation rust library

LongYinan 166 Dec 20, 2022