mirror of
https://github.com/visioncortex/vtracer.git
synced 2026-09-12 15:16:08 -07:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 433a68d6d6 | |||
| bb3b66780b | |||
| 049ba7f503 | |||
| 9d67b7c554 | |||
| fa5d2906c0 | |||
| fae37a709e | |||
| 5c9d5cd757 | |||
| 1b49880f85 | |||
| 0b0d69839a | |||
| 7ea4600176 |
@@ -0,0 +1,22 @@
|
|||||||
|
name: Rust
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Build
|
||||||
|
run: cargo build --verbose
|
||||||
|
- name: Run tests
|
||||||
|
run: cargo test --verbose
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
<img src="docs/images/visioncortex-banner.png">
|
<img src="docs/images/visioncortex-banner.png">
|
||||||
<h1>visioncortex VTracer</h1>
|
<h1>VTracer</h1>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<strong>Raster to Vector Graphics Converter built on top of visioncortex</strong>
|
<strong>Raster to Vector Graphics Converter built on top of visioncortex</strong>
|
||||||
@@ -26,6 +26,8 @@ Comparing to [Potrace]() which only accept binarized inputs (Black & White pixma
|
|||||||
|
|
||||||
Comparing to Adobe Illustrator's Live Trace, VTracer's output is much more compact (less shapes) as we adopt a stacking strategy and avoid producing shapes with holes.
|
Comparing to Adobe Illustrator's Live Trace, VTracer's output is much more compact (less shapes) as we adopt a stacking strategy and avoid producing shapes with holes.
|
||||||
|
|
||||||
|
VTracer is originally designed for processing high resolution scans of historic blueprints up to gigapixels. By setting both `filter_speckle` and `layer_difference` to `0`, VTracer can also handle low resolution pixel art, effectively achieving `image-rendering: pixelated` for retro game artworks.
|
||||||
|
|
||||||
A technical description of the algorithm is on [visioncortex.org/vtracer-docs](//www.visioncortex.org/vtracer-docs).
|
A technical description of the algorithm is on [visioncortex.org/vtracer-docs](//www.visioncortex.org/vtracer-docs).
|
||||||
|
|
||||||
## Web App
|
## Web App
|
||||||
@@ -75,5 +77,5 @@ The library can be found on [crates.io/vtracer](//crates.io/crates/vtracer).
|
|||||||
|
|
||||||
### Install
|
### Install
|
||||||
```
|
```
|
||||||
vtracer = "0.1.0"
|
vtracer = "*"
|
||||||
```
|
```
|
||||||
|
|||||||
+2
-2
@@ -1,10 +1,10 @@
|
|||||||
Version 0.2.0 (2020-10-31)
|
Version 0.2.0 (2020-11-15)
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
- Use relative & closed paths
|
- Use relative & closed paths
|
||||||
|
|
||||||
|
|
||||||
Version 0.1.1 (2020-10-31)
|
Version 0.1.1 (2020-11-01)
|
||||||
==========================
|
==========================
|
||||||
|
|
||||||
- SVG namespace
|
- SVG namespace
|
||||||
|
|||||||
+2
-2
@@ -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,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,
|
||||||
|
|||||||
@@ -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
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
@@ -1,23 +0,0 @@
|
|||||||
K1_drawing
|
|
||||||
B/W 4
|
|
||||||
https://commons.wikimedia.org/wiki/File:K1_drawing.jpg
|
|
||||||
|
|
||||||
Cityscape Sunset_DFM3-01
|
|
||||||
Color 4,8,32
|
|
||||||
<a href="https://www.vecteezy.com/free-vector/building">Building Vectors by Vecteezy</a>
|
|
||||||
|
|
||||||
Gum Tree Vector
|
|
||||||
Color 4,8,32
|
|
||||||
<a href="https://www.vecteezy.com/free-vector/nature">Nature Vectors by Vecteezy</a>
|
|
||||||
|
|
||||||
vectorstock_31191940
|
|
||||||
Color 8,7,64
|
|
||||||
<a href="https://www.vectorstock.com/royalty-free-vector/dessert-poster-design-with-chocolate-cake-mousses-vector-31191940">Vector image by VectorStock / vectorstock</a>
|
|
||||||
|
|
||||||
averie-woodard-4nulm-JUYFo-unsplash
|
|
||||||
Color 8,7,24
|
|
||||||
<span>Photo by <a href="https://unsplash.com/@averieclaire?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">averie woodard</a> on <a href="https://unsplash.com/s/photos/portrait?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></span>
|
|
||||||
|
|
||||||
angel-luciano-LATYeZyw88c-unsplash
|
|
||||||
Color 10,8,48 180
|
|
||||||
<span>Photo by <a href="https://unsplash.com/@roaming_angel?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Angel Luciano</a> on <a href="https://unsplash.com/s/photos/dog?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></span>
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 304 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 3.9 MiB |
Binary file not shown.
|
After Width: | Height: | Size: 9.7 KiB |
Vendored
+1
-1
@@ -258,7 +258,7 @@
|
|||||||
/******/ promises.push(installedWasmModuleData);
|
/******/ promises.push(installedWasmModuleData);
|
||||||
/******/ else {
|
/******/ else {
|
||||||
/******/ var importObject = wasmImportObjects[wasmModuleId]();
|
/******/ var importObject = wasmImportObjects[wasmModuleId]();
|
||||||
/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/vtracer_webapp_bg.wasm":"7ef94c5089d40af744f2"}[wasmModuleId] + ".module.wasm");
|
/******/ var req = fetch(__webpack_require__.p + "" + {"../pkg/vtracer_webapp_bg.wasm":"a62b3494f02004811a57"}[wasmModuleId] + ".module.wasm");
|
||||||
/******/ var promise;
|
/******/ var promise;
|
||||||
/******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') {
|
/******/ if(importObject instanceof Promise && typeof WebAssembly.compileStreaming === 'function') {
|
||||||
/******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {
|
/******/ promise = Promise.all([WebAssembly.compileStreaming(req), importObject]).then(function(items) {
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 5.8 KiB |
+16
-17
@@ -79,8 +79,7 @@
|
|||||||
}
|
}
|
||||||
#canvas-container {
|
#canvas-container {
|
||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
height: max-content;
|
||||||
height: 100%;
|
|
||||||
}
|
}
|
||||||
#svg, #frame {
|
#svg, #frame {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
@@ -91,7 +90,7 @@
|
|||||||
stroke: #ff0;
|
stroke: #ff0;
|
||||||
}
|
}
|
||||||
#droptext {
|
#droptext {
|
||||||
height: 100%;
|
height: 480px;
|
||||||
color: #CC972E;
|
color: #CC972E;
|
||||||
}
|
}
|
||||||
input[type=range]::-webkit-slider-thumb {
|
input[type=range]::-webkit-slider-thumb {
|
||||||
@@ -107,11 +106,11 @@
|
|||||||
background: #00275D;
|
background: #00275D;
|
||||||
border-color: #CC972E;
|
border-color: #CC972E;
|
||||||
}
|
}
|
||||||
#gallery, #options {
|
#drop, #gallery, #options {
|
||||||
border-top: 1px solid #686868;
|
border-top: 1px solid #686868;
|
||||||
}
|
}
|
||||||
#gallery {
|
#gallery {
|
||||||
border-bottom: 1px solid #686868;
|
padding-bottom: 0;
|
||||||
}
|
}
|
||||||
.galleryitem {
|
.galleryitem {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -140,7 +139,7 @@
|
|||||||
<a id="vc-logo" class="uk-logo" href="//www.visioncortex.org"><img style="height: 50px; margin: -30px 0 -25px 0;" src="./assets/visioncortex-logo.svg"></a>
|
<a id="vc-logo" class="uk-logo" href="//www.visioncortex.org"><img style="height: 50px; margin: -30px 0 -25px 0;" src="./assets/visioncortex-logo.svg"></a>
|
||||||
<a id="vc-logo-light" class="uk-logo" href="//www.visioncortex.org"><img style="height: 50px; margin: -30px 0 -25px 0;" src="./assets/visioncortex-logo-light.svg"></a>
|
<a id="vc-logo-light" class="uk-logo" href="//www.visioncortex.org"><img style="height: 50px; margin: -30px 0 -25px 0;" src="./assets/visioncortex-logo-light.svg"></a>
|
||||||
|
|
||||||
VTracer
|
/ VTracer
|
||||||
</div>
|
</div>
|
||||||
<div class="uk-navbar-right uk-padding-small">
|
<div class="uk-navbar-right uk-padding-small">
|
||||||
<a class="uk-button uk-button-default" href="//github.com/visioncortex/vtracer">GitHub</a>
|
<a class="uk-button uk-button-default" href="//github.com/visioncortex/vtracer">GitHub</a>
|
||||||
@@ -152,6 +151,15 @@
|
|||||||
<progress id="progressbar" class="uk-progress uk-align-right" value="0" max="100" style="width: 98%;"></progress>
|
<progress id="progressbar" class="uk-progress uk-align-right" value="0" max="100" style="width: 98%;"></progress>
|
||||||
</div>
|
</div>
|
||||||
<div class="uk-width-3-4">
|
<div class="uk-width-3-4">
|
||||||
|
<div id="drop" class="uk-padding uk-flex uk-flex-center">
|
||||||
|
<div id="canvas-container" class="uk-width-1-1">
|
||||||
|
<div id="droptext" class="uk-flex uk-flex-middle uk-flex-center">
|
||||||
|
<p>Drag an image here, Cmd-V to paste or <a href="#" id="imageSelect">Select file</a></p>
|
||||||
|
</div>
|
||||||
|
<canvas id="frame"></canvas>
|
||||||
|
<svg id="svg" version="1.1" xmlns="http://www.w3.org/2000/svg"></svg>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div id="gallery" class="uk-padding">
|
<div id="gallery" class="uk-padding">
|
||||||
<div class="uk-inline" uk-slider>
|
<div class="uk-inline" uk-slider>
|
||||||
<ul id="galleryslider" class="uk-slider-items uk-child-width-1-6 uk-grid uk-grid-small">
|
<ul id="galleryslider" class="uk-slider-items uk-child-width-1-6 uk-grid uk-grid-small">
|
||||||
@@ -160,16 +168,7 @@
|
|||||||
<a class="uk-position-center-left uk-position-small uk-hidden-hover" href="#" uk-slidenav-previous uk-slider-item="previous"></a>
|
<a class="uk-position-center-left uk-position-small uk-hidden-hover" href="#" uk-slidenav-previous uk-slider-item="previous"></a>
|
||||||
<a class="uk-position-center-right uk-position-small uk-hidden-hover" href="#" uk-slidenav-next uk-slider-item="next"></a>
|
<a class="uk-position-center-right uk-position-small uk-hidden-hover" href="#" uk-slidenav-next uk-slider-item="next"></a>
|
||||||
</div>
|
</div>
|
||||||
<a class="uk-align-right uk-text-meta" style="margin:-5px;" uk-toggle="target: #credits-modal">Credits</a>
|
<a class="uk-align-right uk-text-meta" style="margin:-5px;" uk-toggle="target: #credits-modal">Photo Credits</a>
|
||||||
</div>
|
|
||||||
<div id="drop" class="uk-padding uk-flex uk-flex-center">
|
|
||||||
<div id="canvas-container" class="uk-width-1-1" style="height: 480px;">
|
|
||||||
<div id="droptext" class="uk-flex uk-flex-middle uk-flex-center">
|
|
||||||
<p>Drag an image here, Cmd-V to paste or <a href="#" id="imageSelect">Select file</a></p>
|
|
||||||
</div>
|
|
||||||
<canvas id="frame"></canvas>
|
|
||||||
<svg id="svg" version="1.1" xmlns="http://www.w3.org/2000/svg"></svg>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="options" class="uk-width-1-4 uk-height-1-1 uk-grid-small uk-flex uk-flex-center" uk-grid>
|
<div id="options" class="uk-width-1-4 uk-height-1-1 uk-grid-small uk-flex uk-flex-center" uk-grid>
|
||||||
@@ -202,7 +201,7 @@
|
|||||||
4
|
4
|
||||||
</div>
|
</div>
|
||||||
<div class="uk-width-5-6">
|
<div class="uk-width-5-6">
|
||||||
<input id="filterspeckle" class="uk-range" type="range" min="1" max="128" step="1" value="4">
|
<input id="filterspeckle" class="uk-range" type="range" min="0" max="128" step="1" value="4">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="clustering-color-options uk-width-1-1 uk-flex uk-flex-right">
|
<div class="clustering-color-options uk-width-1-1 uk-flex uk-flex-right">
|
||||||
|
|||||||
+1
-1
@@ -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
@@ -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&utm_medium=referral&utm_content=creditCopyText">averie woodard</a> on <a href="https://unsplash.com/s/photos/portrait?utm_source=unsplash&utm_medium=referral&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&utm_medium=referral&utm_content=creditCopyText">Angel Luciano</a> on <a href="https://unsplash.com/s/photos/dog?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Unsplash</a></span>',
|
credit: '<span>Photo by <a href="https://unsplash.com/@roaming_angel?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText">Angel Luciano</a> on <a href="https://unsplash.com/s/photos/dog?utm_source=unsplash&utm_medium=referral&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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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!(
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user