Feature export unique tiles
This commit is contained in:
28
src/main.rs
28
src/main.rs
@@ -121,6 +121,15 @@ struct Opt {
|
|||||||
/// Keep the image's aspect ratio
|
/// Keep the image's aspect ratio
|
||||||
#[structopt(short, long)]
|
#[structopt(short, long)]
|
||||||
keep_aspect_ratio: bool,
|
keep_aspect_ratio: bool,
|
||||||
|
|
||||||
|
/// Export all resized unique tiles seperately
|
||||||
|
#[structopt(long)]
|
||||||
|
unique_tiles: bool,
|
||||||
|
|
||||||
|
/// Specify export directory of unique tiles export
|
||||||
|
#[structopt(long, default_value = "unique_tiles")]
|
||||||
|
unique_tiles_dir: PathBuf,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
@@ -131,6 +140,8 @@ fn main() -> Result<()> {
|
|||||||
tile_size,
|
tile_size,
|
||||||
keep_aspect_ratio,
|
keep_aspect_ratio,
|
||||||
output_dir,
|
output_dir,
|
||||||
|
unique_tiles,
|
||||||
|
unique_tiles_dir
|
||||||
} = Opt::from_args();
|
} = Opt::from_args();
|
||||||
|
|
||||||
fs::create_dir_all(&output_dir)?;
|
fs::create_dir_all(&output_dir)?;
|
||||||
@@ -139,6 +150,7 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let input_dir = fs::read_dir(input_dir)?.collect::<Result<Vec<_>, _>>()?;
|
let input_dir = fs::read_dir(input_dir)?.collect::<Result<Vec<_>, _>>()?;
|
||||||
|
|
||||||
|
// Run mosaic procedure for every cover image
|
||||||
for image in input_dir {
|
for image in input_dir {
|
||||||
let input_path = image.path();
|
let input_path = image.path();
|
||||||
eprintln!("Processing {}", input_path.display());
|
eprintln!("Processing {}", input_path.display());
|
||||||
@@ -147,10 +159,14 @@ fn main() -> Result<()> {
|
|||||||
"{}.mosaic{mosaic_size}.png",
|
"{}.mosaic{mosaic_size}.png",
|
||||||
input_path.file_stem().unwrap().to_string_lossy()
|
input_path.file_stem().unwrap().to_string_lossy()
|
||||||
));
|
));
|
||||||
|
|
||||||
|
// TODO: decide if we'd like to override the previously generated mosaic
|
||||||
if output.exists() {
|
if output.exists() {
|
||||||
|
println!("Mosaic {} already exists. Skipping.", output.display());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Open the mosaic cover image
|
||||||
let img = image::open(&input_path)?;
|
let img = image::open(&input_path)?;
|
||||||
let img = if keep_aspect_ratio {
|
let img = if keep_aspect_ratio {
|
||||||
img.thumbnail(mosaic_size, mosaic_size)
|
img.thumbnail(mosaic_size, mosaic_size)
|
||||||
@@ -164,6 +180,7 @@ fn main() -> Result<()> {
|
|||||||
.map(|(_x, _y, pixel)| pixel)
|
.map(|(_x, _y, pixel)| pixel)
|
||||||
.collect::<HashSet<_>>();
|
.collect::<HashSet<_>>();
|
||||||
let len = unique_pixels.len();
|
let len = unique_pixels.len();
|
||||||
|
// Create a mapping between pixel and tile
|
||||||
let tiles = unique_pixels
|
let tiles = unique_pixels
|
||||||
.into_par_iter()
|
.into_par_iter()
|
||||||
.progress_with(make_pbar("pixels", len as _))
|
.progress_with(make_pbar("pixels", len as _))
|
||||||
@@ -182,6 +199,17 @@ fn main() -> Result<()> {
|
|||||||
mosaic.copy_from(&**tiles.get(&pixel).unwrap(), x * tile_size, y * tile_size)?;
|
mosaic.copy_from(&**tiles.get(&pixel).unwrap(), x * tile_size, y * tile_size)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Optional export of unique tiles
|
||||||
|
if unique_tiles {
|
||||||
|
// Export tiles
|
||||||
|
for (pixel, tile) in tiles.iter().progress_with(make_pbar("export tiles", len as _)) {
|
||||||
|
// Create a filename from pixel value
|
||||||
|
let name = pixel.0.iter().map(|u| u.to_string()).collect::<String>();
|
||||||
|
let unique_filename = unique_tiles_dir.join(format!("{name}.png"));
|
||||||
|
let _ = tile.save(unique_filename)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let spinner = make_spinner("Saving", "Saved!");
|
let spinner = make_spinner("Saving", "Saved!");
|
||||||
mosaic.save(output)?;
|
mosaic.save(output)?;
|
||||||
spinner.finish_using_style();
|
spinner.finish_using_style();
|
||||||
|
Reference in New Issue
Block a user