Skip to content

Commit 53f7700

Browse files
committed
Implement retrieving XMP metadata for Webp
1 parent 63a59f0 commit 53f7700

File tree

3 files changed

+33
-3
lines changed

3 files changed

+33
-3
lines changed

src/codecs/webp/decoder.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ impl<R: BufRead + Seek> ImageDecoder for WebPDecoder<R> {
8484
Ok(exif)
8585
}
8686

87+
fn xmp_metadata(&mut self) -> ImageResult<Option<Vec<u8>>> {
88+
self.inner
89+
.xmp_metadata()
90+
.map_err(ImageError::from_webp_decode)
91+
}
92+
8793
fn orientation(&mut self) -> ImageResult<Orientation> {
8894
// `exif_metadata` caches the orientation, so call it if `orientation` hasn't been set yet.
8995
if self.orientation.is_none() {
46.5 KB
Loading

tests/metadata.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,47 @@ use std::fs;
22
use std::path::PathBuf;
33
use std::str::FromStr;
44

5-
use image::{codecs::png::PngDecoder, ImageDecoder};
5+
use image::ImageDecoder;
6+
7+
#[cfg(feature = "png")]
8+
use image::codecs::png::PngDecoder;
9+
#[cfg(feature = "webp")]
10+
use image::codecs::webp::WebPDecoder;
611

712
extern crate glob;
813
extern crate image;
914

1015
const XMP_PNG_PATH: &str = "tests/images/png/transparency/tp1n3p08_xmp.png";
11-
const EXPECTED_METADATA: &str = "<?xpacket begin='\u{feff}' id='W5M0MpCehiHzreSzNTczkc9d'?>\n<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 13.25'>\n<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n\n <rdf:Description rdf:about=''\n xmlns:dc='http://purl.org/dc/elements/1.1/'>\n <dc:subject>\n <rdf:Bag>\n <rdf:li>sunset, mountains, nature</rdf:li>\n </rdf:Bag>\n </dc:subject>\n </rdf:Description>\n</rdf:RDF>\n</x:xmpmeta>\n<?xpacket end='r'?>";
16+
const EXPECTED_PNG_METADATA: &str = "<?xpacket begin='\u{feff}' id='W5M0MpCehiHzreSzNTczkc9d'?>\n<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 13.25'>\n<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n\n <rdf:Description rdf:about=''\n xmlns:dc='http://purl.org/dc/elements/1.1/'>\n <dc:subject>\n <rdf:Bag>\n <rdf:li>sunset, mountains, nature</rdf:li>\n </rdf:Bag>\n </dc:subject>\n </rdf:Description>\n</rdf:RDF>\n</x:xmpmeta>\n<?xpacket end='r'?>";
17+
18+
const XMP_WEBP_PATH: &str = "tests/images/webp/lossless_images/simple_xmp.webp";
19+
const EXPECTED_WEBP_METADATA: &str = "<?xpacket begin='\u{feff}' id='W5M0MpCehiHzreSzNTczkc9d'?>\n<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 13.25'>\n<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>\n\n <rdf:Description rdf:about=''\n xmlns:dc='http://purl.org/dc/elements/1.1/'>\n <dc:subject>\n <rdf:Bag>\n <rdf:li>sunset, mountains, nature</rdf:li>\n </rdf:Bag>\n </dc:subject>\n </rdf:Description>\n</rdf:RDF>\n</x:xmpmeta>\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n<?xpacket end='w'?>";
1220

1321
#[test]
22+
#[cfg(feature = "png")]
1423
fn test_read_xmp_png() -> Result<(), image::ImageError> {
1524
let img_path = PathBuf::from_str(XMP_PNG_PATH).unwrap();
1625

1726
let data = fs::read(img_path)?;
1827
let mut png_decoder = PngDecoder::new(std::io::Cursor::new(data))?;
1928
let metadata = png_decoder.xmp_metadata()?;
2029
assert!(metadata.is_some());
21-
assert_eq!(EXPECTED_METADATA.as_bytes(), metadata.unwrap());
30+
assert_eq!(EXPECTED_PNG_METADATA.as_bytes(), metadata.unwrap());
31+
32+
Ok(())
33+
}
34+
35+
#[test]
36+
#[cfg(feature = "webp")]
37+
fn test_read_xmp_webp() -> Result<(), image::ImageError> {
38+
let img_path = PathBuf::from_str(XMP_WEBP_PATH).unwrap();
39+
40+
let data = fs::read(img_path)?;
41+
let mut webp_decoder = WebPDecoder::new(std::io::Cursor::new(data))?;
42+
let metadata = webp_decoder.xmp_metadata()?;
43+
44+
assert!(metadata.is_some());
45+
assert_eq!(EXPECTED_WEBP_METADATA.as_bytes(), metadata.unwrap());
2246

2347
Ok(())
2448
}

0 commit comments

Comments
 (0)