Skip to content

Commit 3be100b

Browse files
committed
Implement retrieving XMP metadata for Webp
1 parent cb0935d commit 3be100b

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

src/codecs/webp/decoder.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,13 @@ 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
89+
.inner
90+
.xmp_metadata()
91+
.map_err(ImageError::from_webp_decode)
92+
}
93+
8794
fn orientation(&mut self) -> ImageResult<Orientation> {
8895
// `exif_metadata` caches the orientation, so call it if `orientation` hasn't been set yet.
8996
if self.orientation.is_none() {
46.5 KB
Loading

tests/metadata.rs

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

5-
use image::{codecs::png::PngDecoder, ImageDecoder};
5+
use image::{codecs::{png::PngDecoder, webp::WebPDecoder}, ImageDecoder};
66

77
extern crate glob;
88
extern crate image;
99

1010
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'?>";
11+
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'?>";
12+
13+
const XMP_WEBP_PATH: &str = "tests/images/webp/lossless_images/simple_xmp.webp";
14+
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'?>";
1215

1316
#[test]
1417
fn test_read_xmp_png() -> Result<(), image::ImageError> {
@@ -18,7 +21,21 @@ fn test_read_xmp_png() -> Result<(), image::ImageError> {
1821
let mut png_decoder = PngDecoder::new(std::io::Cursor::new(data))?;
1922
let metadata = png_decoder.xmp_metadata()?;
2023
assert!(metadata.is_some());
21-
assert_eq!(EXPECTED_METADATA.as_bytes(), metadata.unwrap());
24+
assert_eq!(EXPECTED_PNG_METADATA.as_bytes(), metadata.unwrap());
25+
26+
Ok(())
27+
}
28+
29+
#[test]
30+
fn test_read_xmp_webp() -> Result<(), image::ImageError> {
31+
let img_path = PathBuf::from_str(XMP_WEBP_PATH).unwrap();
32+
33+
let data = fs::read(img_path)?;
34+
let mut webp_decoder = WebPDecoder::new(std::io::Cursor::new(data))?;
35+
let metadata = webp_decoder.xmp_metadata()?;
36+
37+
assert!(metadata.is_some());
38+
assert_eq!(EXPECTED_WEBP_METADATA.as_bytes(), metadata.unwrap());
2239

2340
Ok(())
2441
}

0 commit comments

Comments
 (0)