A library for parsing, splitting, and building Tee skins.
This crate provides tools for parsing a source Tee skin image into its constituent parts (body, feet, hands, eyes, etc.) and then composing them into a final character image with various expressions.
net: Enables network requests (loading skins from URLs) usingTee::new_from_url.
Add this to your Cargo.toml:
[dependencies] tee_morphosis = "1.3.0"To use network capabilities (loading skins from URLs), enable the net feature:
[dependencies] tee_morphosis = { version = "1.3.0", features = ["net"] }Here's a simple example of how to read a skin file, create a character with "happy" eyes, and save the result to a new file.
use std::fs; use bytes::Bytes; use tee_morphosis::tee::{ Tee, parts::EyeType, uv::TEE_UV_LAYOUT, skin::TEE_SKIN_LAYOUT, }; use image::ImageFormat; fn main() -> Result<(), Box<dyn std::error::Error>> { // 1. Read your skin data from a file // Replace "path/to/your_skin.png" with the actual path let skin_data = fs::read("path/to/your_skin.png")?; // 2. Create a Tee instance from the image data let tee = Tee::new( Bytes::from(skin_data), TEE_UV_LAYOUT, ImageFormat::Png, )?; // 3. Compose the final image with the desired eye type let eye_type = EyeType::Happy; let image_bytes = tee.compose( TEE_SKIN_LAYOUT, eye_type, ImageFormat::Png, )?; // or use // // tee.compose_png(TEE_SKIN_LAYOUT, ImageFormat::Png)?; // 4. Save the result to a file fs::write("composed_tee.png", &image_bytes)?; println!("Skin successfully created and saved to composed_tee.png"); Ok(()) }Here's a simple example of how to change color with DDNet color value (or hls)
use std::fs; use bytes::Bytes; use tee_morphosis::tee::{ Tee, hsl::ddnet_color_to_hsl, parts::TeePart }; use image::ImageFormat; fn main() -> Result<(), Box<dyn std::error::Error>> { // 1. Read your skin data from a file // Replace "path/to/your_skin.png" with the actual path let skin_data = fs::read("path/to/your_skin.png")?; // 2. Create a Tee instance from the image data let mut tee = Tee::new( Bytes::from(skin_data), TEE_UV_LAYOUT, ImageFormat::Png, )?; // 3. Generate hls from ddnet value let hsl = ddnet_color_to_hsl(1900500); // 4. apply to all parts tee.apply_hsl_to_all(hsl); // 4.1 or peer parts tee.apply_hsl_to_parts(hsl, &[TeePart::Body, TeePart::BodyShadow]); // 5. Now, compose it let composed = tee.compose_png(TEE_SKIN_LAYOUT, ImageFormat::Png)?; // 4. Save the result to a file fs::write("colored_composed_tee.png", &composed)?; println!("Skin successfully created, colored and saved to colored_composed_tee.png"); Ok(()) }This example demonstrates how to fetch a skin from the internet and assemble it.
use tee_morphosis::tee::{ Tee, parts::EyeType, uv::TEE_UV_LAYOUT, skin::TEE_SKIN_LAYOUT, }; use std::fs; use image::ImageFormat; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // 1. Create a Tee instance from a URL let tee = Tee::new_from_url( "https://teedata.net/databasev2/skins/glow_rainbow/glow_rainbow.png", TEE_UV_LAYOUT, ).await?; // 2. Compose the final image let image_bytes = tee.compose( TEE_SKIN_LAYOUT, EyeType::Surprise, ImageFormat::Png, )?; // 3. Save the result fs::write("composed_from_url.png", &image_bytes)?; println!("Skin successfully downloaded and saved to composed_from_url.png"); Ok(()) }This project is licensed under the MIT License.