Releases: xRyul/obsidian-image-converter
1.3.19
Batch Image Processing
- Fixed #280, #212: More reliable link updates after processing. The fix ensures link updates use the correct original path, avoiding broken links when rename operations occur during batch processing.
- Improved: Batch processing now gracefully handles errors - failed images are rolled back and no longer break the entire batch
| Scenario | Before | After |
|---|---|---|
| Processing fails mid-way | File left renamed but with wrong/corrupt content, broken links | File reverted to original name, other images continue |
| One image fails in batch | Could crash or silently fail entire batch | Only that image fails, user sees specific error notice |
| Link update fails | Potential crash, batch stops | Caught gracefully, user notified, batch continues |
- Canvas support for folder-level batch processing: When processing images linked in notes within a folder, image references in .canvas files are now properly updated (previously only .md files were updated). Note: Canvas link updates for "Process All Vault" and "Process Current Note" have been available since 1.3.0
- Performance: Batch operations now check upfront whether processing is actually needed. If all your images are already in the target format (or in skip list) with no resize/compression configured, you'll get an instant notification instead of waiting for a no-op loop.
- Performance: De-duplicate files by path, so the same image referenced multiple times is processed once. This doesn’t reduce the number of link replacements in the note; it just prevents redundant processing.
- fix: Previously, when batch processing images with "Keep original format" selected alongside compression or resizing, files would be incorrectly renamed to a .original extension (e.g., photo.png → photo.original), breaking links and file recognition. Files now retain their original extension while still being compressed/resized.
Image Resizing
- Fixed duplicate event listeners accumulating when switching between markdown views, potentially affecting performance
- Improved: Scroll-wheel resize modifier (Shift/Ctrl/Alt) now applies immediately when changed in settings
- Fixed: Resize handles sometimes stopped responding after switching notes
- Fixed: Visual glitches when quickly hovering over images
- Improved: More consistent cursor feedback during resize
Context Menu
- Fixed memory leak where event listeners accumulated each time the image context menu was opened
Image Cropping
- Improved responsiveness: crop selection and keyboard shortcuts now work immediately without waiting for image load
Image Annotation
- Fixed export failing in certain environments by adding toDataURL() fallback when toBlob() is unavailable
- Fixed export failing with invalid dimensions by implementing canvas size fallback. Edge cases where "Save" did nothing or threw an error are now handled gracefully. Most users wouldn't have hit this, but those who did would have lost their annotation work.
Image Alignment
- Ensure more consistent cleanup of classes
This release includes significantly expanded automated test coverage to prevent regressions.
Full Changelog: 1.3.18...1.3.19
1.3.18
This release focuses on robustness, correctness, and testability of the image processing pipeline. It hardens error handling, makes MIME detection more reliable, fixes resize semantics, and prevents hanging processes during external tool execution (FFmpeg/pngquant).
Changes
- Unified failure policy: unexpected conversion/decoding errors now return original bytes (no uncaught exceptions).
- MIME detection: More reliable MIME detection from file headers (magic bytes), with safe fallback to original bytes when detection fails.
- Corrected byte position checking (bytes 8-11) for WEBP files, resolving issues where some WEBP images weren't being detected properly.
- Improved fallback to Blob.type when header detection fails completely.
- JPEG EXIF: On EXIF failure, returns JPEG without EXIF instead of failing. Orientation tag is removed before re-applying EXIF to avoid unexpected rotations.
- TIFF/HEIC handling: Return original bytes when decoding fails (unsupported environment or malformed input).
- Resize semantics and quality:
- FILL mode now produces an output canvas of exactly desiredWidth × desiredHeight via center-crop.
- Crop offsets now use integer math to avoid sub-pixel artifacts and cross-platform rendering differences.
- Resize-only (format = NONE) now respects the Quality setting for lossy formats (JPEG/WebP). PNG remains lossless.
- If your Quality is below the browser’s default (JPEG ~0.92; WebP varies by browser): outputs will be smaller and slightly more compressed than before.
- If your Quality is above the default: outputs will be larger and higher quality than before.
- If your Quality is near the default: you likely won’t notice much difference.
- FFmpeg: Added timeout handling and cleanup for FFmpeg operations to prevent hanging.
Potentially Impactful Behavior Changes
- Fill outputs exact requested dimensions with center-crop (may differ from prior aspect-fit behavior). If you depended on previous Fill or Reduce behavior, review your presets and expected outputs.
- Header-based MIME detection may choose different code paths vs. relying solely on file.type.
- Resize-only operations (format = NONE) now respect the quality setting for lossy formats. Previously, resize-only used
browser defaults; now it applies your configured quality value, which may produce different file sizes.
Other
- Updated Typescript from 4.7.4 to 5.9.2 with ES2024 target.
- Updated ESlint from v5.29 to v8.42 with flat configuration format. Applied consistent code style rules across all TypeScript files.
- Updated ESBuild from 0.17.3 to 0.25.9.
- Updated @types/node from v16 to v24.
- Added Vitest 3.2.4 for testing.
1.3.17
Make sure plugin doesn't react to Excalidraw embeds: disable drag/scroll resize, disable context menu
1.3.16
1.3.15
Some UI/UX adjustments to the modal which shows up on drop/paste. Which can be found and enabled at: Image Converter plugin settings -> Show window -> Always show
- Folder and filename inputs are now always visible. They are no longer hidden behind preset selections. Select the preset to auto-populate the input field. Any modifications to the input field will be preserved for the next time you drop/paste the image - it will not overwrite the selected-preset itself. 3 default preset will show empty input fields.
- Filename field is pre-selected by default. This is for those times when you want to quickly rename dropped image into any custom name you desire.
Obsidian_1lFuoQl0Xp.mp4
Added variable search and ability to copy variables into clipboard by clicking on them.
Obsidian_CDDdjDro9g.mp4
1.3.14
- Merged PR #273 , variables like
{YYYY}and{yyyy},{MM}vs{mm}now work as distinct variables. This fixes issues where if both variables were used at the same time in a single template e.g.Month_{MM}_minute_{mm}it would incorrectly return current month for both. This fixes most of themoment.jsvariables which are accessible via{date:xxxxxx}Thanks @martenlienen ! #291 #268 #301 - Fixed
{notepath}Variable: Now returns path without.mdextension (e.g.,"Documents/Photos/MyNote"instead of"Documents/Photos/MyNote.md") - Fixed
{vaultpath}Variable: Now returns actual filesystem path usingadapter.basePath(e.g.,"C:/Users/username/Documents/Obsidian/MyVault") - Removed sanitization of parentheses
()and square brackets[]- these characters will now be allowed in filenames and thus follows Obsidian defaults more closely. #285
1.3.13
1.3.12
Aspect Ratio Lock
New toggle to lock aspect ratio when resizing images. Now, you can drag any corner to resize without stretching or distorting the image.
Thanks to @semisenioritis for contribution #248!
Obsidian_3PuCSrkrH3.mp4
How to Enable:
- Go to
Settings. - Navigate to
Drag & Scroll resize. - Toggle on
Lock the aspect ratio when dragging.
1.3.11
New Variables {grandparentfolder} and {notename_nospaces} #244 Thanks @NullString1
1. {grandparentfolder}
Access to the parent's parent folder name (grandparent folder), but excludes the vault root.
File path: `/Projects/Work/note.md` → Returns: "Projects"
File path: `/Projects/Work/Current/note.md` → Returns: "Work"
Edge Case Handling:
- Note in root folder: Variable validation will show error message: "Cannot use {grandparentfolder} - the current note has no grandparent folder. Please modify your template."
- Note one level deep: Same error message as above
- Grandparent is vault root: Returns the parent folder name instead of empty string
2. {notename_nospaces}
The current note name with spaces removed or replaced; Leading/trailing spaces are trimmed.
Note name: "Meeting Notes" → Returns: "Meeting_Notes"
Note name: "Project Update 2024" → Returns: "Project_Update_2024"
Note name: " Spaced Name " → Returns: "Spaced_Name" (trimmed)
1.3.10
- New option to change caption and size dimensions via right-click input fields. Supports both single width (e.g.,
300) and width x height (e.g.,300x200) formats.
Untitled.Project.mp4
- Currently there is a bug:
- If there is no size or caption present, it will set both sizing and the caption at the same time.
- There is no any re-render mechanism, so results might not always be visible live. Thus you need to switch back and forth between views or notes for changes to appear visually.


