txtools 0.1.1

A set of tools for manipulating textures
Documentation
use crate::utils::{get_boolean_input, pick_file, pick_files, save_image_with_extension_override};
use image::{io::Reader as ImageReader, DynamicImage, GenericImage, GenericImageView, Pixel, Rgba};
use std::io;

pub fn apply_opacity_mask() -> io::Result<()> {
	let path_to_mask = pick_file("Select mask");
	let mask = ImageReader::open(path_to_mask.clone())?
		.decode()
		.expect("could not decode mask");

	let files = pick_files("Select the image(s) that you want to apply the mask to");

	let overwrite_image = get_boolean_input("overwrite image(s)? (y/n)")?;

	for path in files {
		let image = ImageReader::open(path.clone())?
			.decode()
			.expect("could not decode image");

		if mask.width() != image.width() || mask.height() != image.height() {
			return Err(io::Error::new(
				io::ErrorKind::InvalidInput,
				"image dimensions must match mask dimensions",
			));
		}

		let mut new_image = DynamicImage::new_rgba8(image.width(), image.height());

		for x in 0..image.width() {
			for y in 0..image.height() {
				new_image.put_pixel(
					x,
					y,
					get_new_pixel(mask.get_pixel(x, y), image.get_pixel(x, y)),
				);
			}
		}

		save_image_with_extension_override(
			new_image,
			path.clone(),
			overwrite_image,
			"masked",
			"png",
		);
	}

	println!("done");

	Ok(())
}

fn get_new_pixel(mask: Rgba<u8>, texture: Rgba<u8>) -> Rgba<u8> {
	let mask = mask.channels();
	let texture = texture.channels();

	#[allow(clippy::get_first)]
	Rgba::<u8>([
		*texture.get(0).unwrap(),
		*texture.get(1).unwrap(),
		*texture.get(2).unwrap(),
		*mask.get(0).unwrap(),
	])
}