2023-09-17 03:22:54 +04:00
|
|
|
use std::io::Read;
|
|
|
|
|
|
|
|
use byteorder::ReadBytesExt;
|
|
|
|
use image::Rgba;
|
|
|
|
|
|
|
|
fn decode_texture(file_path: &str, output_path: &str) -> Result<(), std::io::Error> {
|
|
|
|
// Читаем файл
|
|
|
|
let mut file = std::fs::File::open(file_path)?;
|
|
|
|
let mut buffer: Vec<u8> = Vec::new();
|
|
|
|
file.read_to_end(&mut buffer)?;
|
|
|
|
|
|
|
|
// Декодируем метаданные
|
|
|
|
let mut cursor = std::io::Cursor::new(&buffer[4..]);
|
|
|
|
let img_width = cursor.read_u32::<byteorder::LittleEndian>()?;
|
|
|
|
let img_height = cursor.read_u32::<byteorder::LittleEndian>()?;
|
|
|
|
|
|
|
|
// Пропустить оставшиеся байты метаданных
|
|
|
|
cursor.set_position(20);
|
|
|
|
|
|
|
|
// Извлекаем данные изображения
|
|
|
|
let image_data = buffer[cursor.position() as usize..].to_vec();
|
|
|
|
let img =
|
|
|
|
image::ImageBuffer::<Rgba<u8>, _>::from_raw(img_width, img_height, image_data.to_vec())
|
|
|
|
.expect("Failed to decode image");
|
|
|
|
|
|
|
|
// Сохраняем изображение
|
|
|
|
img.save(output_path).unwrap();
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let args: Vec<String> = std::env::args().collect();
|
|
|
|
|
|
|
|
let input = &args[1];
|
|
|
|
let output = &args[2];
|
|
|
|
|
2024-01-08 01:10:53 +04:00
|
|
|
if let Err(err) = decode_texture(input, output) {
|
2023-09-17 03:22:54 +04:00
|
|
|
eprintln!("Error: {}", err)
|
|
|
|
}
|
|
|
|
}
|