Dominik Schmidt created TIKA-4937:
-------------------------------------
Summary: Extract image dimensions and entry list from ICO/CUR files
Key: TIKA-4937
URL: https://issues.apache.org/jira/browse/TIKA-4937
Project: Tika
Issue Type: New Feature
Reporter: Dominik Schmidt
h3. Background
Tika detects {{image/vnd.microsoft.icon}} (alias {{image/x-icon}}) and
{{ImageParser}} claims the type, but ImageIO has no ICO reader on the
classpath, so a {{.ico}} yields nothing beyond the content type: no dimensions,
no bit depth, no image count.
Since TIKA-4936 every Windows EXE/DLL emits its icon groups as embedded
{{.ico}} documents (the first one typed {{THUMBNAIL}}), so an index now sees
plenty of .ico entries without width/height.
h3. Proposal
Read the ICONDIR/ICONDIRENTRY structure of {{.ico}} and {{.cur}} files directly
(no decoding, no new dependency) and set:
* {{tiff:ImageWidth}} / {{tiff:ImageLength}} and {{tiff:BitsPerSample}} of the
largest image. Entries of 256 px are stored as 0 in the directory, and the
directory's width/height/bpp fields are unreliable in general, so take the
values from each image's header instead: the PNG IHDR for PNG-encoded entries,
the BITMAPINFOHEADER for BMP-encoded ones (height there is doubled to include
the AND mask).
* the number of images
* one multi-valued property listing each entry as {{WxH@bpp}} plus its encoding
(bmp/png), in directory order
* for cursors ({{.cur}}, type 2 in the header): the hotspot of the largest image
No text content. Malformed files (directory beyond EOF, entry offsets outside
the file, count 0, unknown encoding) must not throw: emit what can be read and
record a warning.
Implementation: a dedicated small parser in {{tika-parser-image-module}} for
{{image/vnd.microsoft.icon}} and {{image/x-win-bitmap}}, replacing the
{{image/x-icon}} entry in {{ImageParser}}'s supported types (which currently
finds no reader).
h3. Out of scope
* Decoding or rendering the images (the thumbnail presets keep passing the .ico
through as stored)
* Animated cursors ({{.ani}}), {{RT_GROUP_CURSOR}} extraction from PE files
h3. Acceptance criteria
* {{tika -m}} on a .ico with 16/32 px BMP entries and a 256 px PNG entry
reports 256x256, 32 bpp, 3 images and the per-entry list.
* The embedded icons of TIKA-4936's fixtures show width/height in {{/rmeta}}
output.
* A .cur reports type cursor and the hotspot.
* Truncated or corrupt .ico files yield a warning, not an exception.
* Fixtures: {{testWindows-icons-app.ico}} / {{-doc.ico}} from TIKA-4936 plus
one generated .cur.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)