Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "ImageToSpriteConverter.hpp"
- #include <iostream>
- #include <iomanip>
- #include <algorithm>
- #include <cmath>
- namespace HokutoConverter {
- ImageToSpriteConverter::ImageToSpriteConverter()
- : currentX(0), currentY(0), spritesPerRow(10), rng(std::random_device{}()) {
- masterSpriteSheet = cv::Mat(cv::Size(32 * spritesPerRow, 32 * 100),
- CV_8UC3, cv::Scalar(0, 0, 0));
- initializeCharacterPalettes();
- initializeColorMaps();
- }
- ImageToSpriteConverter::~ImageToSpriteConverter() {}
- void ImageToSpriteConverter::initializeCharacterPalettes() {
- // KENSHIRO - Blue outfit, black hair, tan skin
- characterPalettes[HokutoCharacter::KENSHIRO] = {
- cv::Scalar(50, 50, 80), // primary - dark blue
- cv::Scalar(30, 30, 50), // secondary
- cv::Scalar(255, 224, 189), // skin
- cv::Scalar(0, 0, 0), // hair - black
- cv::Scalar(0, 0, 0), // eyes
- cv::Scalar(255, 100, 0) // aura - orange
- };
- // REI - Purple outfit, blonde hair
- characterPalettes[HokutoCharacter::REI] = {
- cv::Scalar(150, 100, 150), // primary - purple
- cv::Scalar(130, 80, 130), // secondary
- cv::Scalar(255, 230, 205), // skin - light
- cv::Scalar(255, 200, 150), // hair - blonde
- cv::Scalar(100, 100, 200), // eyes - blue
- cv::Scalar(100, 200, 255) // aura - water blue
- };
- // RAOH - Brown armor, tan skin
- characterPalettes[HokutoCharacter::RAOH] = {
- cv::Scalar(80, 50, 30), // primary - brown
- cv::Scalar(60, 40, 20), // secondary
- cv::Scalar(245, 215, 180), // skin - tan
- cv::Scalar(30, 30, 30), // hair - dark brown
- cv::Scalar(150, 50, 50), // eyes - red
- cv::Scalar(150, 0, 150) // aura - purple
- };
- // TOKI - Blue outfit, light brown hair
- characterPalettes[HokutoCharacter::TOKI] = {
- cv::Scalar(100, 100, 120), // primary - light blue
- cv::Scalar(80, 80, 100), // secondary
- cv::Scalar(255, 235, 210), // skin - pale
- cv::Scalar(200, 180, 150), // hair - light brown
- cv::Scalar(100, 100, 100), // eyes - gray
- cv::Scalar(100, 200, 200) // aura - cyan
- };
- // SHIN - White outfit, black hair
- characterPalettes[HokutoCharacter::SHIN] = {
- cv::Scalar(200, 200, 200), // primary - white
- cv::Scalar(180, 180, 180), // secondary
- cv::Scalar(255, 220, 195), // skin - light
- cv::Scalar(0, 0, 0), // hair - black
- cv::Scalar(50, 50, 150), // eyes - blue
- cv::Scalar(200, 200, 255) // aura - white
- };
- // SOUTHER - Red armor, blonde hair
- characterPalettes[HokutoCharacter::SOUTHER] = {
- cv::Scalar(200, 50, 50), // primary - red
- cv::Scalar(180, 30, 30), // secondary
- cv::Scalar(255, 225, 200), // skin
- cv::Scalar(255, 255, 0), // hair - gold
- cv::Scalar(100, 100, 255), // eyes - blue
- cv::Scalar(255, 100, 100) // aura - red
- };
- // KAIOH - Purple armor, golden hair
- characterPalettes[HokutoCharacter::KAIOH] = {
- cv::Scalar(100, 50, 150), // primary - purple
- cv::Scalar(80, 30, 130), // secondary
- cv::Scalar(235, 205, 170), // skin - dark
- cv::Scalar(255, 200, 50), // hair - gold
- cv::Scalar(255, 50, 50), // eyes - red
- cv::Scalar(150, 0, 200) // aura - dark purple
- };
- // HYOH - Red armor, golden hair
- characterPalettes[HokutoCharacter::HYOH] = {
- cv::Scalar(150, 50, 50), // primary - dark red
- cv::Scalar(130, 30, 30), // secondary
- cv::Scalar(255, 225, 190), // skin
- cv::Scalar(255, 200, 100), // hair - golden
- cv::Scalar(200, 100, 100), // eyes - red
- cv::Scalar(200, 100, 0) // aura - orange
- };
- // FALCO - Golden armor
- characterPalettes[HokutoCharacter::FALCO] = {
- cv::Scalar(255, 215, 0), // primary - gold
- cv::Scalar(235, 195, 0), // secondary
- cv::Scalar(255, 225, 195), // skin
- cv::Scalar(255, 215, 0), // hair - gold
- cv::Scalar(100, 100, 200), // eyes
- cv::Scalar(255, 215, 0) // aura - gold
- };
- // JUZA - Green outfit, golden hair
- characterPalettes[HokutoCharacter::JUZA] = {
- cv::Scalar(100, 150, 50), // primary - green
- cv::Scalar(80, 130, 30), // secondary
- cv::Scalar(255, 225, 200), // skin
- cv::Scalar(255, 200, 100), // hair - golden
- cv::Scalar(100, 200, 100), // eyes
- cv::Scalar(100, 255, 100) // aura - green
- };
- // YUDA - Pink outfit
- characterPalettes[HokutoCharacter::YUDA] = {
- cv::Scalar(255, 50, 100), // primary - pink
- cv::Scalar(235, 30, 80), // secondary
- cv::Scalar(255, 230, 210), // skin - pale
- cv::Scalar(255, 100, 150), // hair - pink
- cv::Scalar(200, 100, 200), // eyes
- cv::Scalar(255, 100, 150) // aura - pink
- };
- // SHACHI - Blue outfit, black hair
- characterPalettes[HokutoCharacter::SHACHI] = {
- cv::Scalar(50, 100, 150), // primary - blue
- cv::Scalar(30, 80, 130), // secondary
- cv::Scalar(245, 215, 180), // skin - tan
- cv::Scalar(0, 0, 0), // hair - black
- cv::Scalar(100, 150, 200), // eyes
- cv::Scalar(100, 200, 255) // aura - blue
- };
- // HAN - Gray armor
- characterPalettes[HokutoCharacter::HAN] = {
- cv::Scalar(100, 100, 100), // primary - gray
- cv::Scalar(80, 80, 80), // secondary
- cv::Scalar(245, 215, 180), // skin
- cv::Scalar(150, 100, 50), // hair - brown
- cv::Scalar(150, 100, 50), // eyes
- cv::Scalar(200, 150, 100) // aura - brown
- };
- // JUKEI - Brown robe, white hair
- characterPalettes[HokutoCharacter::JUKEI] = {
- cv::Scalar(100, 80, 60), // primary - brown
- cv::Scalar(80, 60, 40), // secondary
- cv::Scalar(235, 205, 170), // skin - wrinkled
- cv::Scalar(200, 200, 200), // hair - white
- cv::Scalar(100, 100, 100), // eyes - gray
- cv::Scalar(255, 215, 0) // aura - gold
- };
- // SHEW - Yellow/tan outfit, white hair
- characterPalettes[HokutoCharacter::SHEW] = {
- cv::Scalar(200, 200, 100), // primary - yellow
- cv::Scalar(180, 180, 80), // secondary
- cv::Scalar(245, 215, 180), // skin - tan
- cv::Scalar(255, 255, 255), // hair - white
- cv::Scalar(100, 100, 100), // eyes
- cv::Scalar(255, 255, 200) // aura - light yellow
- };
- }
- ConvertedResult ImageToSpriteConverter::convertImageToSprite(const std::string& imagePath,
- HokutoCharacter character,
- const ConversionConfig& customConfig) {
- auto start = std::chrono::steady_clock::now();
- ConvertedResult result;
- result.originalFile = imagePath;
- result.character = character;
- // Load image
- cv::Mat original = cv::imread(imagePath);
- if(original.empty()) {
- std::cerr << "Failed to load image: " << imagePath << std::endl;
- stats.failed++;
- return result;
- }
- // Update config
- config = customConfig;
- // Detect image source type
- ImageSourceType sourceType = detectImageSource(original);
- stats.sourceTypeCount[sourceType]++;
- // Adjust config based on source type
- if(config.quality == QualityPreset::NORMAL) {
- switch(sourceType) {
- case ImageSourceType::ANIME_SCREENSHOT:
- case ImageSourceType::ANIME_ARTWORK:
- config.colorDepth = 32;
- config.pixelBlockSize = 1.5f;
- break;
- case ImageSourceType::THREE_D_RENDER:
- config.colorDepth = 64;
- config.pixelBlockSize = 3.0f;
- config.edgeEnhancement = true;
- break;
- case ImageSourceType::HD_PHOTO:
- config.colorDepth = 128;
- config.pixelBlockSize = 4.0f;
- config.dithering = true;
- break;
- default:
- break;
- }
- }
- // Convert to pixel art based on character
- cv::Mat pixelArt;
- switch(character) {
- case HokutoCharacter::KENSHIRO:
- result = convertToKenshiro(original, config);
- break;
- case HokutoCharacter::REI:
- result = convertToRei(original, config);
- break;
- case HokutoCharacter::RAOH:
- result = convertToRaoh(original, config);
- break;
- case HokutoCharacter::TOKI:
- result = convertToToki(original, config);
- break;
- case HokutoCharacter::SHIN:
- result = convertToShin(original, config);
- break;
- case HokutoCharacter::SOUTHER:
- result = convertToSouther(original, config);
- break;
- case HokutoCharacter::KAIOH:
- result = convertToKaioh(original, config);
- break;
- case HokutoCharacter::HYOH:
- result = convertToHyoh(original, config);
- break;
- case HokutoCharacter::FALCO:
- result = convertToFalco(original, config);
- break;
- case HokutoCharacter::JUZA:
- result = convertToJuza(original, config);
- break;
- case HokutoCharacter::YUDA:
- result = convertToYuda(original, config);
- break;
- case HokutoCharacter::SHACHI:
- result = convertToShachi(original, config);
- break;
- case HokutoCharacter::HAN:
- result = convertToHan(original, config);
- break;
- case HokutoCharacter::JUKEI:
- result = convertToJukei(original, config);
- break;
- case HokutoCharacter::SHEW:
- result = convertToShew(original, config);
- break;
- default:
- result = convertToKenshiro(original, config);
- }
- // Apply character palette
- cv::Mat paletted = applyCharacterPalette(result.sprite, character);
- // Resize to target size
- cv::Mat finalSprite;
- resizeKeepAspect(paletted, finalSprite, config.targetSize);
- // Add to sprite sheet
- std::string spriteName = getCharacterName(character) + "_" + fs::path(imagePath).stem().string();
- addToSpriteSheet(finalSprite, spriteName, character);
- // Update result
- result.sprite = finalSprite;
- result.spriteName = spriteName;
- result.finalSize = config.targetSize;
- auto end = std::chrono::steady_clock::now();
- result.conversionTime = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
- // Update statistics
- stats.totalProcessed++;
- stats.successful++;
- stats.characterCount[character]++;
- stats.totalTime += result.conversionTime;
- std::cout << "✓ " << getCharacterName(character) << " ← "
- << fs::path(imagePath).filename().string()
- << " (" << result.conversionTime << "ms)" << std::endl;
- return result;
- }
Advertisement
Add Comment
Please, Sign In to add comment