mirror of
https://github.com/lifegpc/msg-tool.git
synced 2026-07-08 01:31:53 +08:00
Add auto detect image type
This commit is contained in:
29
src/main.rs
29
src/main.rs
@@ -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 => {
|
||||||
|
|||||||
33
src/types.rs
33
src/types.rs
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user