Skip to content

Commit e6028cb

Browse files
CopilotHexagon
andauthored
Add comprehensive EXIF 3.0 compliant metadata support with camera settings, GPS coordinates, InteropIFD, and refactored utilities (#58)
Co-authored-by: Hexagon <419737+Hexagon@users.noreply.github.com>
1 parent fd5b4c2 commit e6028cb

16 files changed

Lines changed: 4255 additions & 95 deletions

README.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,110 @@ See the
124124
[full format support documentation](https://cross-image.56k.guru/formats/) for
125125
detailed compatibility information.
126126

127+
## Metadata Support
128+
129+
@cross/image provides comprehensive EXIF 3.0 compliant metadata support for
130+
image files, including camera information, GPS coordinates, and InteropIFD
131+
compatibility markers.
132+
133+
### Supported Metadata Fields
134+
135+
**Basic Metadata:**
136+
137+
- `title`, `description`, `author`, `copyright`
138+
- `creationDate` - Date/time image was created
139+
140+
**Camera Settings (JPEG, TIFF, WebP via XMP):**
141+
142+
- `cameraMake`, `cameraModel` - Camera manufacturer and model
143+
- `lensMake`, `lensModel` - Lens information
144+
- `iso` - ISO speed rating
145+
- `exposureTime` - Shutter speed in seconds
146+
- `fNumber` - Aperture (f-number)
147+
- `focalLength` - Focal length in mm
148+
- `flash`, `whiteBalance` - Capture settings
149+
- `orientation` - Image orientation (1=normal, 3=180°, 6=90°CW, 8=90°CCW)
150+
- `software` - Software used
151+
- `userComment` - User notes
152+
153+
**GPS Coordinates (All EXIF formats: JPEG, PNG, WebP, TIFF):**
154+
155+
- `latitude`, `longitude` - GPS coordinates in decimal degrees
156+
- Full microsecond precision with DMS (degrees-minutes-seconds) conversion
157+
158+
**DPI (JPEG, PNG, TIFF):**
159+
160+
- `dpiX`, `dpiY` - Dots per inch for printing
161+
162+
### EXIF 3.0 Specification Compliance
163+
164+
The library implements the EXIF 3.0 specification with:
165+
166+
- **50+ Exif Sub-IFD tags** for comprehensive camera metadata
167+
- **30+ IFD0 tags** for image information
168+
- **InteropIFD support** for format compatibility (R98/sRGB, R03/Adobe RGB,
169+
THM/thumbnail)
170+
- **GPS IFD** with proper coordinate conversion
171+
- All EXIF data types (BYTE, ASCII, SHORT, LONG, RATIONAL, etc.)
172+
173+
### Example Usage
174+
175+
```typescript
176+
import { Image } from "@cross/image";
177+
178+
// Load an image
179+
const data = await Deno.readFile("photo.jpg");
180+
const image = await Image.decode(data);
181+
182+
// Set metadata
183+
image.setMetadata({
184+
author: "Jane Photographer",
185+
copyright: "© 2024",
186+
cameraMake: "Canon",
187+
cameraModel: "EOS R5",
188+
iso: 800,
189+
exposureTime: 0.004, // 1/250s
190+
fNumber: 2.8,
191+
focalLength: 50,
192+
});
193+
194+
// Set GPS coordinates
195+
image.setPosition(40.7128, -74.0060); // NYC
196+
197+
// Check what metadata a format supports
198+
const jpegSupports = Image.getSupportedMetadata("jpeg");
199+
console.log(jpegSupports); // Includes ISO, camera info, GPS, etc.
200+
201+
// Save with metadata
202+
const jpeg = await image.save("jpeg");
203+
await Deno.writeFile("output.jpg", jpeg);
204+
205+
// Metadata is preserved on reload!
206+
const loaded = await Image.decode(jpeg);
207+
console.log(loaded.metadata?.cameraMake); // "Canon"
208+
console.log(loaded.getPosition()); // { latitude: 40.7128, longitude: -74.0060 }
209+
```
210+
211+
### Format-Specific Support
212+
213+
Use `Image.getSupportedMetadata(format)` to check which fields are supported:
214+
215+
```typescript
216+
Image.getSupportedMetadata("jpeg"); // Full camera metadata + GPS (21 fields)
217+
Image.getSupportedMetadata("tiff"); // Comprehensive EXIF + GPS + InteropIFD (23+ fields)
218+
Image.getSupportedMetadata("png"); // DateTime, GPS, DPI, basic text (9 fields)
219+
Image.getSupportedMetadata("webp"); // Enhanced XMP + GPS (15 fields - includes camera metadata!)
220+
```
221+
222+
**Format Highlights:**
223+
224+
- **JPEG**: Most comprehensive EXIF support, including all camera settings and
225+
GPS
226+
- **TIFF**: Full EXIF 3.0 support with IFD structure, InteropIFD compatibility
227+
- **WebP**: Enhanced XMP implementation with Dublin Core, EXIF, and TIFF
228+
namespaces
229+
- **PNG**: Basic EXIF support via eXIf chunk plus GPS coordinates
230+
127231
## Documentation
128232

129233
- **[API Reference](https://cross-image.56k.guru/api/)** - Complete API

0 commit comments

Comments
 (0)