This commit is contained in:
2023-04-03 02:28:02 +03:00
commit bf9f9f8c22
5 changed files with 908 additions and 0 deletions

19
src/lib.rs Normal file
View File

@ -0,0 +1,19 @@
use anyhow::Result;
use magick_rust::{magick_wand_genesis, MagickWand};
use std::sync::Once;
static START: Once = Once::new();
pub fn liquid_rescale_image(image: &Vec<u8>) -> Result<Vec<u8>> {
START.call_once(|| {
magick_wand_genesis();
});
let wand = MagickWand::new();
wand.read_image_blob(&image)?;
wand.fit(640, 640);
wand.liquid_rescale_image(320, 320, 1.0, 0.0)?;
wand.fit(640, 640);
let bytes = wand.write_image_blob("JPEG")?;
Ok(bytes)
}

44
src/main.rs Normal file
View File

@ -0,0 +1,44 @@
use anyhow::Result;
use axum::body::Full;
use axum::extract::DefaultBodyLimit;
use axum::http::Response;
use axum::response::IntoResponse;
use axum::{extract::Multipart, routing::post, Router};
use liquid_rescale_api::liquid_rescale_image;
#[tokio::main]
async fn main() {
let app = Router::new()
.route("/liquid", post(liquid_rescale_route))
.layer(DefaultBodyLimit::max(1024 * 10_000 /* 10 MiB */));
axum::Server::bind(&"0.0.0.0:3000".parse().unwrap())
.serve(app.into_make_service())
.await
.unwrap();
}
async fn liquid_rescale_route(multipart: Multipart) -> impl IntoResponse {
let image = parse_image(multipart).await.unwrap();
let image_data = liquid_rescale_image(&image).unwrap();
let body = Full::from(image_data);
Response::builder()
.header("Content-Type", "image/jpeg")
.body(body)
.unwrap()
}
async fn parse_image(mut multipart: Multipart) -> Result<Vec<u8>> {
while let Some(field) = multipart.next_field().await.unwrap() {
if let Some("file") = field.name() {
let bytes = field.bytes().await?;
let image_data = bytes.to_vec();
return Ok(image_data);
}
}
Err(anyhow::anyhow!("Missing file field"))
}