Percent decode
authorMegaBrutal <code+git@megabrutal.com>
Sat, 25 Jun 2022 10:30:00 +0000 (12:30 +0200)
committerMegaBrutal <code+git@megabrutal.com>
Sat, 25 Jun 2022 10:30:00 +0000 (12:30 +0200)
Cargo.lock
Cargo.toml
src/main.rs

index 9894ebcf0e0bcce86239b353310cd1d0297f87d7..34a3e1ea0891edb4ed987400c92c4d176b03204e 100644 (file)
@@ -125,6 +125,8 @@ version = "0.0.0"
 dependencies = [
  "actix-web",
  "image",
+ "percent-encoding",
+ "serde",
 ]
 
 [[package]]
@@ -1156,6 +1158,20 @@ name = "serde"
 version = "1.0.137"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.137"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
 
 [[package]]
 name = "serde_json"
index 9265f3fd31d2bf5a89f1b36cba69ec50409c16dc..dbc8a8d4f3573479daa89599873d073c0811f688 100644 (file)
@@ -8,6 +8,8 @@ edition = "2021"
 [dependencies]
 actix-web = "4.1.0"
 image = "0.24.2"
+percent-encoding = "2.1.0"
+serde = { version = "1.0.137", features = ["derive"] }
 
 [profile.release]
 lto = true
index 2b8da321cded66a1c496555a7574560b005a2bd4..d721276de678d503d8b6ddd49d41a227018b0636 100644 (file)
@@ -1,11 +1,19 @@
 use std::io::Cursor;
 use std::fmt::Display;
 use std::fmt;
+use serde::Deserialize;
+use percent_encoding::percent_decode_str;
 use actix_web::{get, web, App, HttpServer, HttpResponse, Responder, ResponseError, Result};
 use actix_web::body::BoxBody;
 use actix_web::http::StatusCode;
 use image::{ImageBuffer, ColorType, Rgb, RgbImage, write_buffer_with_format};
 use image::ImageOutputFormat::Png;
+use image::imageops::{FilterType, resize};
+
+#[derive(Deserialize)]
+struct Data {
+    data: String
+}
 
 #[derive(Debug)]
 struct ImageError(image::ImageError);
@@ -27,24 +35,22 @@ impl ResponseError for ImageError {
 }
 
 struct StringToRgb<'a> {
-    text: &'a str,
     iter: Box<dyn Iterator<Item = char> + 'a>
 }
 
 impl<'a> StringToRgb<'a> {
     fn new(text: &'a str) -> StringToRgb {
-        StringToRgb { text, iter: Box::new(text.chars()) }
+        StringToRgb { iter: Box::new(text.chars()) }
     }
 }
 
-
-
 impl Iterator for StringToRgb<'_> {
     type Item = Rgb<u8>;
     fn next(&mut self) -> Option<Rgb<u8>> {
         let r = self.iter.next();
         let g = self.iter.next();
         let b = self.iter.next();
+        println!("{:?} {:?} {:?}", r, g, b);
         if r.is_none() && g.is_none() && b.is_none() {
             None
         }
@@ -67,19 +73,19 @@ async fn greet(name: web::Path<String>) -> impl Responder {
 }
 
 #[get("/gen/{data}")]
-async fn img_gen(data: web::Path<String>) -> Result<impl Responder> {
+async fn img_gen(data: web::Path<Data>) -> Result<impl Responder> {
     let mut cursor = Cursor::new(Vec::new());
-    let mut img: RgbImage = ImageBuffer::new(128, 128);
+    let mut img: RgbImage = ImageBuffer::new(32, 32);
     let mut pixels = img.pixels_mut();
-    //let mut rgb = Box::new(StringToRgb::new(&data));
-    let mut rgb = StringToRgb::new(&data);
 
-    for sp in rgb {
+    for sp in StringToRgb::new(&percent_decode_str(&data.data).decode_utf8_lossy()) {
         let mut dp = pixels.next().unwrap();
+        println!("{:?}", sp);
         dp.0 = sp.0;
     }
 
-    to_imageresult(write_buffer_with_format(&mut cursor, &img, 128, 128, ColorType::Rgb8, Png))?;
+    let img = resize(&img, 512, 512, FilterType::Nearest);
+    to_imageresult(write_buffer_with_format(&mut cursor, &img, 512, 512, ColorType::Rgb8, Png))?;
     Ok(HttpResponse::build(StatusCode::OK)
        .content_type("image/png")
        .body(cursor.into_inner()))