init commit
This commit is contained in:
parent
4de155f33f
commit
af7c7d93d0
1846
Cargo.lock
generated
Normal file
1846
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
12
Cargo.toml
Normal file
12
Cargo.toml
Normal file
|
@ -0,0 +1,12 @@
|
|||
[package]
|
||||
name = "ipimg"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
ab_glyph = "0.2.26"
|
||||
axum = "0.7.5"
|
||||
axum-client-ip = "0.6.0"
|
||||
image = { version = "0.25.1", features = ["png"], default-features = false }
|
||||
imageproc = "0.25.0"
|
||||
tokio = { version = "1.37.0", features = ["rt-multi-thread"] }
|
BIN
Roboto-Regular.ttf
Normal file
BIN
Roboto-Regular.ttf
Normal file
Binary file not shown.
49
src/main.rs
Normal file
49
src/main.rs
Normal file
|
@ -0,0 +1,49 @@
|
|||
use std::{io::Cursor, net::SocketAddr};
|
||||
|
||||
use ab_glyph::FontRef;
|
||||
use axum::{extract::State, http::header, response::IntoResponse, routing::get, Router};
|
||||
use axum_client_ip::InsecureClientIp;
|
||||
use image::Rgba;
|
||||
use imageproc::drawing::{self, text_size};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let fontfile = include_bytes!("../Roboto-Regular.ttf");
|
||||
let font = FontRef::try_from_slice(fontfile).unwrap();
|
||||
|
||||
let app = Router::new().route("/ip.png", get(ip_png)).with_state(font);
|
||||
|
||||
let list = tokio::net::TcpListener::bind("0.0.0.0:8080").await.unwrap();
|
||||
axum::serve(
|
||||
list,
|
||||
app.into_make_service_with_connect_info::<SocketAddr>(),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
async fn ip_png(ip: InsecureClientIp, State(font): State<FontRef<'static>>) -> impl IntoResponse {
|
||||
let out_buf = tokio::task::spawn_blocking(move || {
|
||||
let text = ip.0.to_string();
|
||||
let (x, _) = text_size(100.0, &font, &text);
|
||||
let mut img = image::DynamicImage::new(x, 100, image::ColorType::Rgba8);
|
||||
|
||||
let textcol = Rgba([127, 127, 127, 255]);
|
||||
drawing::draw_text_mut(&mut img, textcol, 0, 0, 100.0, &font, &text);
|
||||
|
||||
let mut buf = Vec::new();
|
||||
img.write_to(&mut Cursor::new(&mut buf), image::ImageFormat::Png)
|
||||
.unwrap();
|
||||
|
||||
buf
|
||||
})
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let headers = [
|
||||
(header::CONTENT_TYPE, "image/png"),
|
||||
(header::CACHE_CONTROL, "private, max-age=60"),
|
||||
];
|
||||
|
||||
(headers, out_buf)
|
||||
}
|
Loading…
Reference in a new issue