diff --git a/crates/bevy_render/src/texture/image.rs b/crates/bevy_render/src/texture/image.rs index 4b0a46bd3a..e951ff83a8 100644 --- a/crates/bevy_render/src/texture/image.rs +++ b/crates/bevy_render/src/texture/image.rs @@ -109,6 +109,26 @@ impl ImageFormat { ImageFormat::Basis | ImageFormat::Ktx2 => return None, }) } + + pub fn from_image_crate_format(format: image::ImageFormat) -> Option { + Some(match format { + image::ImageFormat::Avif => ImageFormat::Avif, + image::ImageFormat::Bmp => ImageFormat::Bmp, + image::ImageFormat::Dds => ImageFormat::Dds, + image::ImageFormat::Farbfeld => ImageFormat::Farbfeld, + image::ImageFormat::Gif => ImageFormat::Gif, + image::ImageFormat::OpenExr => ImageFormat::OpenExr, + image::ImageFormat::Hdr => ImageFormat::Hdr, + image::ImageFormat::Ico => ImageFormat::Ico, + image::ImageFormat::Jpeg => ImageFormat::Jpeg, + image::ImageFormat::Png => ImageFormat::Png, + image::ImageFormat::Pnm => ImageFormat::Pnm, + image::ImageFormat::Tga => ImageFormat::Tga, + image::ImageFormat::Tiff => ImageFormat::Tiff, + image::ImageFormat::WebP => ImageFormat::WebP, + _ => return None, + }) + } } #[derive(Asset, Reflect, Debug, Clone)] diff --git a/crates/bevy_render/src/texture/image_loader.rs b/crates/bevy_render/src/texture/image_loader.rs index 6bd906c1d0..3f5f4e3124 100644 --- a/crates/bevy_render/src/texture/image_loader.rs +++ b/crates/bevy_render/src/texture/image_loader.rs @@ -51,6 +51,7 @@ pub enum ImageFormatSetting { #[default] FromExtension, Format(ImageFormat), + Guess, } #[derive(Serialize, Deserialize, Debug)] @@ -100,6 +101,18 @@ impl AssetLoader for ImageLoader { ImageType::Extension(ext) } ImageFormatSetting::Format(format) => ImageType::Format(format), + ImageFormatSetting::Guess => { + let format = image::guess_format(&bytes).map_err(|err| FileTextureError { + error: err.into(), + path: format!("{}", load_context.path().display()), + })?; + ImageType::Format(ImageFormat::from_image_crate_format(format).ok_or_else( + || FileTextureError { + error: TextureError::UnsupportedTextureFormat(format!("{format:?}")), + path: format!("{}", load_context.path().display()), + }, + )?) + } }; Ok(Image::from_buffer( #[cfg(all(debug_assertions, feature = "dds"))]