Add auto detect image type

This commit is contained in:
2025-08-10 09:36:47 +08:00
parent 066dac2f50
commit 8f5a5b170f
2 changed files with 58 additions and 4 deletions

View File

@@ -752,7 +752,16 @@ pub fn export_script(
return Ok(types::ScriptResult::Ok); return Ok(types::ScriptResult::Ok);
} }
let img_data = script.export_image()?; let img_data = script.export_image()?;
let out_type = arg.image_type.unwrap_or(types::ImageOutputType::Png); let out_type = arg.image_type.unwrap_or_else(|| {
if root_dir.is_some() {
types::ImageOutputType::Png
} else {
output
.as_ref()
.and_then(|s| types::ImageOutputType::try_from(std::path::Path::new(s)).ok())
.unwrap_or(types::ImageOutputType::Png)
}
});
let f = if filename == "-" { let f = if filename == "-" {
String::from("-") String::from("-")
} else { } else {
@@ -1152,7 +1161,14 @@ pub fn import_script(
} }
#[cfg(feature = "image")] #[cfg(feature = "image")]
if script.is_image() { if script.is_image() {
let out_type = arg.image_type.unwrap_or(types::ImageOutputType::Png); let out_type = arg.image_type.unwrap_or_else(|| {
if root_dir.is_some() {
types::ImageOutputType::Png
} else {
types::ImageOutputType::try_from(std::path::Path::new(&imp_cfg.output))
.unwrap_or(types::ImageOutputType::Png)
}
});
let out_f = if let Some(root_dir) = root_dir { let out_f = if let Some(root_dir) = root_dir {
let f = std::path::PathBuf::from(filename); let f = std::path::PathBuf::from(filename);
let mut pb = std::path::PathBuf::from(&imp_cfg.output); let mut pb = std::path::PathBuf::from(&imp_cfg.output);
@@ -1488,8 +1504,13 @@ pub fn create_file(
typ typ
)); ));
} }
let data = let data = utils::img::decode_img(
utils::img::decode_img(arg.image_type.unwrap_or(types::ImageOutputType::Png), input)?; arg.image_type.unwrap_or_else(|| {
types::ImageOutputType::try_from(std::path::Path::new(input))
.unwrap_or(types::ImageOutputType::Png)
}),
input,
)?;
let output = match output { let output = match output {
Some(output) => output.to_string(), Some(output) => output.to_string(),
None => { None => {

View File

@@ -494,6 +494,39 @@ pub enum ImageOutputType {
Webp, Webp,
} }
#[cfg(feature = "image")]
impl TryFrom<&str> for ImageOutputType {
type Error = anyhow::Error;
/// Try to convert a extension string to an `ImageOutputType`.
/// Extensions are case-insensitive.
fn try_from(value: &str) -> Result<Self, Self::Error> {
match value.to_ascii_lowercase().as_str() {
"png" => Ok(ImageOutputType::Png),
#[cfg(feature = "image-jpg")]
"jpg" => Ok(ImageOutputType::Jpg),
#[cfg(feature = "image-jpg")]
"jpeg" => Ok(ImageOutputType::Jpg),
#[cfg(feature = "image-webp")]
"webp" => Ok(ImageOutputType::Webp),
_ => Err(anyhow::anyhow!("Unsupported image output type: {}", value)),
}
}
}
#[cfg(feature = "image")]
impl TryFrom<&std::path::Path> for ImageOutputType {
type Error = anyhow::Error;
fn try_from(value: &std::path::Path) -> Result<Self, Self::Error> {
if let Some(ext) = value.extension() {
Self::try_from(ext.to_string_lossy().as_ref())
} else {
Err(anyhow::anyhow!("No extension found in path"))
}
}
}
#[cfg(feature = "image")] #[cfg(feature = "image")]
impl AsRef<str> for ImageOutputType { impl AsRef<str> for ImageOutputType {
fn as_ref(&self) -> &str { fn as_ref(&self) -> &str {