Initial commit
This commit is contained in:
commit
3ae737e20f
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
/target/
|
||||||
|
**/*.rs.bk
|
||||||
|
Cargo.lock
|
12
Cargo.toml
Normal file
12
Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
authors = ["Sakuhl <2012collector@gmail.com>"]
|
||||||
|
name = "wynnautocrop"
|
||||||
|
version = "0.1.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
image = "0.18.0"
|
||||||
|
imgur = "0.7.0"
|
||||||
|
palette = "0.2.1"
|
||||||
|
reqwest = "0.8.2"
|
||||||
|
rocket = "0.3.5"
|
||||||
|
rocket_codegen = "0.3.5"
|
1
RustConfig
Normal file
1
RustConfig
Normal file
@ -0,0 +1 @@
|
|||||||
|
VERSION=nightly-2017-12-20
|
38
src/bin/server.rs
Normal file
38
src/bin/server.rs
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#![feature(plugin, custom_derive)]
|
||||||
|
#![plugin(rocket_codegen)]
|
||||||
|
|
||||||
|
extern crate rocket;
|
||||||
|
|
||||||
|
extern crate reqwest;
|
||||||
|
|
||||||
|
extern crate image;
|
||||||
|
use image::ImageFormat;
|
||||||
|
|
||||||
|
extern crate imgur;
|
||||||
|
|
||||||
|
extern crate wynnautocrop;
|
||||||
|
use wynnautocrop::*;
|
||||||
|
|
||||||
|
use std::io::{Cursor, Read};
|
||||||
|
|
||||||
|
#[derive(FromForm)]
|
||||||
|
struct UrlForm {
|
||||||
|
url: String
|
||||||
|
}
|
||||||
|
|
||||||
|
#[get("/crop?<url>")]
|
||||||
|
fn crop_url(url: UrlForm) -> String {
|
||||||
|
let url = url.url;
|
||||||
|
let mut buf = Vec::new();
|
||||||
|
reqwest::get(&url).unwrap().read_to_end(&mut buf).unwrap();
|
||||||
|
let mut img = image::load(Cursor::new(&*buf), image::guess_format(&buf).unwrap()).unwrap();
|
||||||
|
img = crop(img);
|
||||||
|
let mut buf = Vec::new();
|
||||||
|
img.save(&mut buf, ImageFormat::PNG).unwrap();
|
||||||
|
let handle = imgur::Handle::new("c819d6faf0219ac".to_owned());
|
||||||
|
handle.upload(&buf).unwrap().link().unwrap().to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
rocket::ignite().mount("/", routes![crop_url]).launch();
|
||||||
|
}
|
67
src/lib.rs
Normal file
67
src/lib.rs
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
extern crate image;
|
||||||
|
use image::{DynamicImage, GenericImage};
|
||||||
|
|
||||||
|
extern crate palette;
|
||||||
|
use palette::{Hsv, Rgb, FromColor};
|
||||||
|
|
||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
|
pub fn crop(mut img: DynamicImage) -> DynamicImage {
|
||||||
|
let mut minx = 0;//img.width();
|
||||||
|
let mut maxx = 0;
|
||||||
|
let mut miny = 0;//img.height();
|
||||||
|
let mut maxy = 0;
|
||||||
|
let mut points = HashSet::new();
|
||||||
|
for x in 0..img.width() {
|
||||||
|
for y in 0..img.height() {
|
||||||
|
let rgb = img.get_pixel(x, y);
|
||||||
|
let hsv = Hsv::<f64>::from_rgb(Rgb::new_u8(rgb.data[0], rgb.data[1], rgb.data[2]));
|
||||||
|
let hue_diff = hsv.hue.to_positive_degrees() - 265.0;
|
||||||
|
if hue_diff > -16.0 && hue_diff < 10.0 && hsv.saturation > 0.7 && hsv.value > 0.18 {
|
||||||
|
//img.put_pixel(x, y, RED);
|
||||||
|
points.insert((x, y));
|
||||||
|
/*
|
||||||
|
if x < minx {
|
||||||
|
minx = x;
|
||||||
|
}
|
||||||
|
if x > maxx {
|
||||||
|
maxx = x;
|
||||||
|
}
|
||||||
|
if y < miny {
|
||||||
|
miny = y;
|
||||||
|
}
|
||||||
|
if y > maxy {
|
||||||
|
maxy = y;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for point in &points {
|
||||||
|
let x = point.0;
|
||||||
|
let y = point.1;
|
||||||
|
let mut x2 = x;
|
||||||
|
for next_x in x.. {
|
||||||
|
if !points.contains(&(next_x, y)) {
|
||||||
|
x2 = next_x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut y2 = y;
|
||||||
|
for next_y in y.. {
|
||||||
|
if !points.contains(&(x, next_y)) {
|
||||||
|
y2 = next_y;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (x2 - x) > (maxx - minx) {
|
||||||
|
maxx = x2;
|
||||||
|
minx = x;
|
||||||
|
}
|
||||||
|
if (y2 - y) > (maxy - miny) {
|
||||||
|
maxy = y2;
|
||||||
|
miny = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
img.crop(minx, miny, maxx-minx, maxy-miny)
|
||||||
|
}
|
21
src/main.rs
Normal file
21
src/main.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
extern crate image;
|
||||||
|
use image::ImageFormat;
|
||||||
|
|
||||||
|
extern crate wynnautocrop;
|
||||||
|
use wynnautocrop::*;
|
||||||
|
|
||||||
|
use std::env;
|
||||||
|
use std::fs::File;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let imgs = env::args().skip(1).collect::<Vec<_>>();
|
||||||
|
|
||||||
|
for img in imgs {
|
||||||
|
let img_crop = img.clone() + ".crop.png";
|
||||||
|
let mut img = image::open(img).unwrap();
|
||||||
|
|
||||||
|
img = crop(img);
|
||||||
|
|
||||||
|
img.save(&mut File::create(img_crop).unwrap(), ImageFormat::PNG).unwrap();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user