wip
This commit is contained in:
commit
ab7734c229
6 changed files with 4208 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
4063
Cargo.lock
generated
Normal file
4063
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
10
Cargo.toml
Normal file
10
Cargo.toml
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
[package]
|
||||||
|
edition = "2024"
|
||||||
|
name = "remove_background"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
clap = { version = "4.5", features = ["derive"] }
|
||||||
|
image = "0.25"
|
||||||
|
reqwest = { version = "0.13", features = ["blocking"] }
|
||||||
|
show-image = { version = "0.14", features = ["image"] }
|
||||||
71
flake.nix
Normal file
71
flake.nix
Normal file
|
|
@ -0,0 +1,71 @@
|
||||||
|
{
|
||||||
|
description = "Remove background Rust project with X11/Wayland support";
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
rust-overlay.url = "github:oxalica/rust-overlay";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
nixpkgs,
|
||||||
|
rust-overlay,
|
||||||
|
flake-utils,
|
||||||
|
}:
|
||||||
|
flake-utils.lib.eachDefaultSystem (
|
||||||
|
system:
|
||||||
|
let
|
||||||
|
overlays = [ (import rust-overlay) ];
|
||||||
|
pkgs = import nixpkgs { inherit system overlays; };
|
||||||
|
stdenv = pkgs.stdenvAdapters.useMoldLinker pkgs.clangStdenv;
|
||||||
|
rustToolchain = pkgs.rust-bin.stable.latest.default;
|
||||||
|
|
||||||
|
nativeBuildInputs = with pkgs; [
|
||||||
|
rustToolchain
|
||||||
|
mold
|
||||||
|
pkg-config
|
||||||
|
clang
|
||||||
|
];
|
||||||
|
|
||||||
|
xorgBuildInputs = with pkgs; [
|
||||||
|
xorg.libX11
|
||||||
|
xorg.libXcursor
|
||||||
|
xorg.libXi
|
||||||
|
xorg.libXrandr
|
||||||
|
];
|
||||||
|
|
||||||
|
waylandBuildInputs = with pkgs; [
|
||||||
|
libxkbcommon
|
||||||
|
wayland
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = xorgBuildInputs ++ waylandBuildInputs;
|
||||||
|
|
||||||
|
mkShell = pkgs.mkShell.override {
|
||||||
|
stdenv = stdenv;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
packages.default = pkgs.rustPlatform.buildRustPackage {
|
||||||
|
inherit stdenv buildInputs nativeBuildInputs;
|
||||||
|
pname = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.name;
|
||||||
|
version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.version;
|
||||||
|
src = ./.;
|
||||||
|
cargoLock = {
|
||||||
|
lockFile = ./Cargo.lock;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
devShells.default = mkShell {
|
||||||
|
inherit buildInputs nativeBuildInputs;
|
||||||
|
|
||||||
|
RUST_BACKTRACE = 1;
|
||||||
|
shellHook = ''
|
||||||
|
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${pkgs.lib.makeLibraryPath buildInputs}"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
2
rust-toolchain.toml
Normal file
2
rust-toolchain.toml
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
[toolchain]
|
||||||
|
channel = "stable"
|
||||||
61
src/main.rs
Normal file
61
src/main.rs
Normal file
|
|
@ -0,0 +1,61 @@
|
||||||
|
use clap::Parser;
|
||||||
|
use image::GenericImageView;
|
||||||
|
use show_image::{AsImageView, create_window, event};
|
||||||
|
use std::error::Error;
|
||||||
|
|
||||||
|
#[derive(Parser)]
|
||||||
|
#[command(name = "remove_background")]
|
||||||
|
#[command(about = "Download and display an image (future: background removal)", long_about = None)]
|
||||||
|
struct Args {
|
||||||
|
#[arg(help = "URL of the image to download and display")]
|
||||||
|
url: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[show_image::main]
|
||||||
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
// Parse command line arguments
|
||||||
|
let args = Args::parse();
|
||||||
|
|
||||||
|
println!("Downloading image from: {}", args.url);
|
||||||
|
|
||||||
|
// Download the image with a user agent (using blocking client)
|
||||||
|
let client = reqwest::blocking::Client::builder()
|
||||||
|
.user_agent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36")
|
||||||
|
.build()?;
|
||||||
|
let response = client.get(&args.url).send()?;
|
||||||
|
|
||||||
|
if !response.status().is_success() {
|
||||||
|
return Err(format!("Failed to download image: HTTP {}", response.status()).into());
|
||||||
|
}
|
||||||
|
|
||||||
|
let bytes = response.bytes()?;
|
||||||
|
println!("Downloaded {} bytes", bytes.len());
|
||||||
|
|
||||||
|
// Load the image
|
||||||
|
let img = image::load_from_memory(&bytes)?;
|
||||||
|
let (width, height) = img.dimensions();
|
||||||
|
println!("Loaded image: {}x{}", width, height);
|
||||||
|
|
||||||
|
// Create a window and display the image.
|
||||||
|
let window = create_window("image", Default::default())?;
|
||||||
|
window.set_image(
|
||||||
|
"downloaded image",
|
||||||
|
&img.as_image_view().map_err(|e| e.to_string())?,
|
||||||
|
)?;
|
||||||
|
|
||||||
|
println!("Image displayed. Press ESC to close the window.");
|
||||||
|
|
||||||
|
// Event loop - wait for ESC key to close
|
||||||
|
for event in window.event_channel()? {
|
||||||
|
if let event::WindowEvent::KeyboardInput(event) = event {
|
||||||
|
if event.input.key_code == Some(event::VirtualKeyCode::Escape)
|
||||||
|
&& event.input.state.is_pressed()
|
||||||
|
{
|
||||||
|
println!("ESC pressed, closing...");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue