2024-05-08 14:52:24 +02:00
|
|
|
#include "io.h"
|
|
|
|
|
#include <fstream>
|
|
|
|
|
#include "logger.h"
|
|
|
|
|
#include "core/config.h"
|
|
|
|
|
|
2024-05-09 01:16:08 +02:00
|
|
|
namespace image
|
2024-05-08 14:52:24 +02:00
|
|
|
{
|
|
|
|
|
void load_img(Image &img, std::string file)
|
|
|
|
|
{
|
|
|
|
|
std::ifstream file_sigature_src(file, std::ios::binary);
|
|
|
|
|
uint8_t signature[10];
|
|
|
|
|
file_sigature_src.read((char *)signature, 10);
|
2024-05-08 21:38:32 +02:00
|
|
|
if (signature[0] == 0xFF && signature[1] == 0xD8)
|
|
|
|
|
load_jpeg(img, file);
|
|
|
|
|
else if (signature[0] == 0x89 && signature[1] == 0x50 && signature[2] == 0x4E && signature[3] == 0x47)
|
2024-05-08 14:52:24 +02:00
|
|
|
load_png(img, file);
|
2024-05-08 21:38:32 +02:00
|
|
|
else if (signature[0] == 0xff && signature[1] == 0x4f && signature[2] == 0xff && signature[3] == 0x51)
|
|
|
|
|
load_j2k(img, file);
|
|
|
|
|
else if (signature[0] == 'P' && (signature[1] == '5' || signature[1] == '6'))
|
|
|
|
|
load_pbm(img, file);
|
|
|
|
|
else if (signature[0] == 'I' && signature[1] == 'I' && signature[2] == '*')
|
|
|
|
|
load_tiff(img, file);
|
2024-05-12 17:11:34 +02:00
|
|
|
else if (signature[0] == 'q' && signature[1] == 'o' && signature[2] == 'i' && signature[3] == 'f')
|
|
|
|
|
load_qoi(img, file);
|
2024-05-08 14:52:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void load_img(Image &img, uint8_t *buffer, int size)
|
|
|
|
|
{
|
|
|
|
|
if (buffer[0] == 0xFF && buffer[1] == 0xD8)
|
|
|
|
|
load_jpeg(img, buffer, size);
|
|
|
|
|
else if (buffer[0] == 0x89 && buffer[1] == 0x50 && buffer[2] == 0x4E && buffer[3] == 0x47)
|
|
|
|
|
load_png(img, buffer, size);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void save_img(Image &img, std::string file, bool fast)
|
|
|
|
|
{
|
2024-05-11 14:46:56 -04:00
|
|
|
if (!append_ext(&file))
|
2024-05-08 14:52:24 +02:00
|
|
|
return;
|
|
|
|
|
logger->info("Saving " + file + "...");
|
|
|
|
|
if (file.find(".png") != std::string::npos)
|
|
|
|
|
save_png(img, file, fast);
|
|
|
|
|
else if (file.find(".jpeg") != std::string::npos || file.find(".jpg") != std::string::npos)
|
|
|
|
|
save_jpeg(img, file);
|
2024-05-08 21:38:32 +02:00
|
|
|
else if (file.find(".j2k") != std::string::npos)
|
|
|
|
|
save_j2k(img, file);
|
|
|
|
|
else if ((file.find(".ppm") != std::string::npos) || (file.find(".pgm") != std::string::npos) || (file.find(".pbm") != std::string::npos))
|
|
|
|
|
save_pbm(img, file);
|
|
|
|
|
else if ((file.find(".tif") != std::string::npos) || (file.find(".gtif") != std::string::npos) || (file.find(".tiff") != std::string::npos))
|
|
|
|
|
save_tiff(img, file);
|
2024-05-12 17:11:34 +02:00
|
|
|
else if (file.find(".qoi") != std::string::npos)
|
|
|
|
|
save_qoi(img, file);
|
2024-05-08 14:52:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Append selected file extension
|
2024-05-11 14:46:56 -04:00
|
|
|
bool append_ext(std::string *file, bool prod)
|
2024-05-08 14:52:24 +02:00
|
|
|
{
|
|
|
|
|
// Do nothing if there's already an extension
|
|
|
|
|
if (file->find(".png") != std::string::npos ||
|
|
|
|
|
file->find(".jpeg") != std::string::npos ||
|
|
|
|
|
file->find(".jpg") != std::string::npos ||
|
|
|
|
|
file->find(".j2k") != std::string::npos ||
|
|
|
|
|
file->find(".pgm") != std::string::npos ||
|
|
|
|
|
file->find(".pbm") != std::string::npos ||
|
|
|
|
|
file->find(".ppm") != std::string::npos ||
|
|
|
|
|
file->find(".tif") != std::string::npos ||
|
|
|
|
|
file->find(".tiff") != std::string::npos ||
|
2024-05-12 17:11:34 +02:00
|
|
|
file->find(".gtif") != std::string::npos ||
|
|
|
|
|
file->find(".qoi") != std::string::npos)
|
2024-05-08 14:52:24 +02:00
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
// Otherwise, load the user setting
|
|
|
|
|
std::string image_format;
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
if (prod)
|
|
|
|
|
image_format = satdump::config::main_cfg["satdump_general"]["product_format"]["value"];
|
|
|
|
|
else
|
|
|
|
|
image_format = satdump::config::main_cfg["satdump_general"]["image_format"]["value"];
|
|
|
|
|
}
|
|
|
|
|
catch (std::exception &e)
|
|
|
|
|
{
|
|
|
|
|
logger->error("Image format not specified, and default format cannot be found! %s", e.what());
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-12 14:27:55 -04:00
|
|
|
if (image_format != "png" && image_format != "jpg" && image_format != "j2k" && image_format != "pbm" && image_format != "tif" && image_format != "qoi")
|
2024-05-08 14:52:24 +02:00
|
|
|
{
|
|
|
|
|
logger->error("Image format not specified, and default format is invalid!");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*file += "." + image_format;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|