Update to visioncortex 0.4.0

This commit is contained in:
Chris Tsang
2020-12-19 01:34:01 +08:00
parent bb3b66780b
commit 433a68d6d6
8 changed files with 39 additions and 24 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "vtracer" name = "vtracer"
version = "0.2.0" version = "0.2.1"
authors = ["Chris Tsang <tyt2y7@gmail.com>"] authors = ["Chris Tsang <tyt2y7@gmail.com>"]
edition = "2018" edition = "2018"
description = "A cmd app to convert images into vector graphics." description = "A cmd app to convert images into vector graphics."
@@ -13,4 +13,4 @@ keywords = ["svg", "computer-graphics"]
[dependencies] [dependencies]
clap = "2.33.3" clap = "2.33.3"
image = "0.23.10" image = "0.23.10"
visioncortex = "0.3.0" visioncortex = "0.4.0"
+1 -1
View File
@@ -1,7 +1,7 @@
use std::str::FromStr; use std::str::FromStr;
use std::path::PathBuf; use std::path::PathBuf;
use clap::{Arg, App}; use clap::{Arg, App};
use visioncortex::path::PathSimplifyMode; use visioncortex::PathSimplifyMode;
pub enum Preset { pub enum Preset {
Bw, Bw,
+4 -1
View File
@@ -1,7 +1,8 @@
use std::path::PathBuf; use std::path::PathBuf;
use std::{fs::File, io::Write}; use std::{fs::File, io::Write};
use visioncortex::{Color, ColorImage, ColorName, color_clusters::RunnerConfig, color_clusters::Runner}; use visioncortex::{Color, ColorImage, ColorName};
use visioncortex::color_clusters::{Runner, RunnerConfig, HIERARCHICAL_MAX};
use super::config::{Config, ColorMode, ConverterConfig}; use super::config::{Config, ColorMode, ConverterConfig};
use super::svg::SvgFile; use super::svg::SvgFile;
@@ -26,6 +27,8 @@ fn color_image_to_svg(config: ConverterConfig) -> Result<(), String> {
} }
let runner = Runner::new(RunnerConfig { let runner = Runner::new(RunnerConfig {
diagonal: config.layer_difference == 0,
hierarchical: HIERARCHICAL_MAX,
batch_size: 25600, batch_size: 25600,
good_min_area: config.filter_speckle_area, good_min_area: config.filter_speckle_area,
good_max_area: (width * height), good_max_area: (width * height),
+1 -1
View File
@@ -22,7 +22,7 @@ console_log = { version = "0.2", features = ["color"] }
wasm-bindgen = { version = "0.2", features = ["serde-serialize"] } wasm-bindgen = { version = "0.2", features = ["serde-serialize"] }
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
visioncortex = "0.3.0" visioncortex = "0.4.0"
# The `console_error_panic_hook` crate provides better debugging of panics by # The `console_error_panic_hook` crate provides better debugging of panics by
# logging them with `console.error`. This is great for development, but requires # logging them with `console.error`. This is great for development, but requires
+25 -15
View File
@@ -98,19 +98,6 @@ var presetConfigs = [
source: 'https://www.vectorstock.com/royalty-free-vector/dessert-poster-design-with-chocolate-cake-mousses-vector-31191940', source: 'https://www.vectorstock.com/royalty-free-vector/dessert-poster-design-with-chocolate-cake-mousses-vector-31191940',
credit: '<a href="https://www.vectorstock.com/royalty-free-vector/dessert-poster-design-with-chocolate-cake-mousses-vector-31191940">Vector image by VectorStock / vectorstock</a>', credit: '<a href="https://www.vectorstock.com/royalty-free-vector/dessert-poster-design-with-chocolate-cake-mousses-vector-31191940">Vector image by VectorStock / vectorstock</a>',
}, },
{
src: 'assets/samples/averie-woodard-4nulm-JUYFo-unsplash-s.jpg',
clustering_mode: 'color',
filter_speckle: 8,
color_precision: 7,
layer_difference: 24,
mode: 'spline',
corner_threshold: 60,
length_threshold: 4,
splice_threshold: 45,
source: 'https://unsplash.com/photos/4nulm-JUYFo',
credit: '<span>Photo by <a href="https://unsplash.com/@averieclaire?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">averie woodard</a> on <a href="https://unsplash.com/s/photos/portrait?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></span>',
},
{ {
src: 'assets/samples/angel-luciano-LATYeZyw88c-unsplash-s.jpg', src: 'assets/samples/angel-luciano-LATYeZyw88c-unsplash-s.jpg',
clustering_mode: 'color', clustering_mode: 'color',
@@ -124,10 +111,23 @@ var presetConfigs = [
source: 'https://unsplash.com/photos/LATYeZyw88c', source: 'https://unsplash.com/photos/LATYeZyw88c',
credit: '<span>Photo by <a href="https://unsplash.com/@roaming_angel?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Angel Luciano</a> on <a href="https://unsplash.com/s/photos/dog?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></span>', credit: '<span>Photo by <a href="https://unsplash.com/@roaming_angel?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Angel Luciano</a> on <a href="https://unsplash.com/s/photos/dog?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></span>',
}, },
{
src: 'assets/samples/tank-unit-preview.png',
clustering_mode: 'color',
filter_speckle: 0,
color_precision: 8,
layer_difference: 0,
mode: 'none',
corner_threshold: 180,
length_threshold: 4,
splice_threshold: 45,
source: 'https://opengameart.org/content/sideview-sci-fi-patreon-collection',
credit: '<span>Artwork by <a href="https://opengameart.org/content/sideview-sci-fi-patreon-collection">Luis Zuno</a> on <a href="https://opengameart.org/">opengameart.org</a></span>',
},
]; ];
// Insert gallery items dynamically // Insert gallery items dynamically
for (let i = 0; i < presetConfigs.length; ++i) { for (let i = 0; i < presetConfigs.length; i++) {
document.getElementById('galleryslider').innerHTML += document.getElementById('galleryslider').innerHTML +=
`<li> `<li>
<div class="galleryitem uk-panel uk-flex uk-flex-center"> <div class="galleryitem uk-panel uk-flex uk-flex-center">
@@ -322,9 +322,19 @@ window.addEventListener('beforeunload', function () {
function setSourceAndRestart(source) { function setSourceAndRestart(source) {
img.src = source instanceof File ? URL.createObjectURL(source) : source; img.src = source instanceof File ? URL.createObjectURL(source) : source;
img.onload = function () { img.onload = function () {
svg.setAttribute('viewBox', `0 0 ${img.naturalWidth} ${img.naturalHeight}`); const width = img.naturalWidth, height = img.naturalHeight;
svg.setAttribute('viewBox', `0 0 ${width} ${height}`);
canvas.width = img.naturalWidth; canvas.width = img.naturalWidth;
canvas.height = img.naturalHeight; canvas.height = img.naturalHeight;
if (height > width) {
document.getElementById('canvas-container').style.width = '50%';
document.getElementById('canvas-container').style.marginBottom = (height / width * 50) + '%';
} else {
document.getElementById('canvas-container').style.width = '';
document.getElementById('canvas-container').style.marginBottom = (height / width * 100) + '%';
}
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
ctx.getImageData(0, 0, canvas.width, canvas.height);
restart(); restart();
} }
// Show display // Show display
+1 -1
View File
@@ -46,7 +46,7 @@ impl Canvas {
image.data().to_vec() image.data().to_vec()
} }
pub fn get_image_data_as_image(&self, x: u32, y: u32, width: u32, height: u32) -> ColorImage { pub fn get_image_data_as_color_image(&self, x: u32, y: u32, width: u32, height: u32) -> ColorImage {
ColorImage { ColorImage {
pixels: self.get_image_data(x, y, width, height), pixels: self.get_image_data(x, y, width, height),
width: width as usize, width: width as usize,
+1 -1
View File
@@ -54,7 +54,7 @@ impl BinaryImageConverter {
pub fn init(&mut self) { pub fn init(&mut self) {
let width = self.canvas.width() as u32; let width = self.canvas.width() as u32;
let height = self.canvas.height() as u32; let height = self.canvas.height() as u32;
let image = self.canvas.get_image_data_as_image(0, 0, width, height); let image = self.canvas.get_image_data_as_color_image(0, 0, width, height);
let binary_image = image.to_binary_image(|x| x.r < 128); let binary_image = image.to_binary_image(|x| x.r < 128);
self.clusters = binary_image.to_clusters(false); self.clusters = binary_image.to_clusters(false);
self.canvas.log(&format!( self.canvas.log(&format!(
+4 -2
View File
@@ -1,6 +1,6 @@
use wasm_bindgen::prelude::*; use wasm_bindgen::prelude::*;
use visioncortex::PathSimplifyMode; use visioncortex::PathSimplifyMode;
use visioncortex::color_clusters::{IncrementalBuilder, Clusters, Runner, RunnerConfig}; use visioncortex::color_clusters::{IncrementalBuilder, Clusters, Runner, RunnerConfig, HIERARCHICAL_MAX};
use crate::canvas::*; use crate::canvas::*;
use crate::svg::*; use crate::svg::*;
@@ -64,8 +64,10 @@ impl ColorImageConverter {
pub fn init(&mut self) { pub fn init(&mut self) {
let width = self.canvas.width() as u32; let width = self.canvas.width() as u32;
let height = self.canvas.height() as u32; let height = self.canvas.height() as u32;
let image = self.canvas.get_image_data_as_image(0, 0, width, height); let image = self.canvas.get_image_data_as_color_image(0, 0, width, height);
let runner = Runner::new(RunnerConfig { let runner = Runner::new(RunnerConfig {
diagonal: self.params.layer_difference == 0,
hierarchical: HIERARCHICAL_MAX,
batch_size: 25600, batch_size: 25600,
good_min_area: self.params.filter_speckle, good_min_area: self.params.filter_speckle,
good_max_area: (width * height) as usize, good_max_area: (width * height) as usize,