Skip to content

chore(deps): bump image from 0.63.0 to 0.65.0#46

Open
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/hex/image-0.65.0
Open

chore(deps): bump image from 0.63.0 to 0.65.0#46
dependabot[bot] wants to merge 1 commit intomainfrom
dependabot/hex/image-0.65.0

Conversation

@dependabot
Copy link
Copy Markdown

@dependabot dependabot Bot commented on behalf of github Apr 18, 2026

Bumps image from 0.63.0 to 0.65.0.

Release notes

Sourced from image's releases.

Image version 0.65.0

Bug Fixes

  • Use the updated colorspace names in Color 0.4.0.

Image version 0.64.0

The primary intent of this release is to stablise the code in readiness for a 1.0 release. Deprecated code has been removed, a standardised color model introduced (via the new library color) and objective classification and detection has been removed to a new image_detection library.

Breaking Changes

  • Five long-deprecated functions have been removed:

    • Image.interpretation/1 — use Image.colorspace/1.
    • Image.type/1 (was format/1) — use Image.band_format/1.
    • Image.convert_to_mask/1 — use Image.convert_alpha_to_mask/1.
    • Image.convert_to_mask!/1 — use Image.convert_alpha_to_mask!/1.
    • Image.map_pages/2 — use Image.map_join_pages/2.
  • Image.Color has been removed. Color handling now lives in two new modules and one new dependency:

  • Image.Classification and Image.Generation have moved to a new sibling package, :image_detection.

  • :bumblebee is no longer a dependency of :image. It is configured in the new library image_detection.

  • Image.Video is now backed by Xav (a thin Elixir wrapper around FFmpeg) instead of :evision / OpenCV. The public API surface is largely unchanged but the underlying type, options, and a few semantic details have moved:

    • The video struct is now %Image.Video{} (with fields :reader, :source, :fps, :duration_seconds, :frame_count, :width, :height) rather than %Evision.VideoCapture{}. Pattern-match on the new struct module if your code does so.

    • Image.Video.open/2's :backend option has been removed. FFmpeg picks the demuxer automatically and there is no concept of pluggable backends in Xav.

    • Image.Video.known_backends/0, available_backends/0, known_backend?/1, known_backend_values/0, and available_backend?/1 have been removed for the same reason. Image.Options.Video (the module that owned the backend table) has been deleted.

    • Camera input is now opened via a platform-specific device path. :default_camera resolves to /dev/video0 on Linux, "0" (AVFoundation device 0) on macOS, and "video=0" on Windows. An integer camera index is mapped to the corresponding /dev/videoN (or platform equivalent). For non-default cameras you can also pass an explicit FFmpeg device string.

    • Frame-based seeking (Image.Video.seek/2 with frame: n, and Image.Video.image_from_video/2 with frame: n) is now implemented as a time-based seek to n / fps followed by zero or more next_frame calls. For most files this lands on the requested frame; for very inter-frame-compressed files FFmpeg may snap to the nearest preceding keyframe.

    • Image.Video.close/1 is now a no-op that returns {:ok, %Image.Video{reader: nil}}. Xav garbage-collects the underlying FFmpeg context, so explicit close is no longer necessary. The function is retained for source compatibility; subsequent operations on the closed struct return {:error, %Image.Error{reason: :video_closed}}.

    • Image and audio frames are decoded by FFmpeg + libswscale rather than by OpenCV's videoio backend. Pixel-exact comparisons against fixtures generated by the previous version will not match; the test fixture test/support/validate/video/video_sample_frame_0.png has been regenerated.

  • :xav is now an optional dependency. It requires FFmpeg ≥ 6.0 to be installed on the system. Add it to your mix.exs if you use Image.Video:

    {:xav, "~> 0.10", optional: true}
    
  • :evision is no longer needed for Image.Video. It is still required for Image.QRcode and for the Image.to_evision/2 / Image.from_evision/1 interop helpers, which are unchanged. The README's optional-dependency table reflects the new split.

  • Image.Error is now a structured public exception. It carries :reason (atom or {atom, value} tuple), :operation, :path, :value, and a derived :message. Every fallible function in the library now returns {:ok, value} or {:error, %Image.Error{}} — bare-string error tuples have been eliminated. Bang variants raise the same struct. The new Image.Error.wrap/2 helper attaches structured context to a raw libvips or File.* error. Pattern-match on :reason instead of scraping :message:

    case Image.open(path) do
      {:ok, image} -> ...
      {:error, %Image.Error{reason: :enoent}} -> not_found_handler()
    

... (truncated)

Changelog

Sourced from image's changelog.

Image 0.65.0

This is the changelog for Image version 0.65.0 released on April 9th, 2026. For older changelogs please consult the release tag on GitHub

Bug Fixes

  • Use the updated colorspace names in Color 0.4.0.

Image 0.64.0

This is the changelog for Image version 0.64.0 released on April 9th, 2026. For older changelogs please consult the release tag on GitHub

The primary intent of this release is to stablise the code in readiness for a 1.0 release. Deprecated code has been removed, a standardised color model introduced (via the new library color) and objective classification and detection has been removed to a new image_detection library.

Breaking Changes

  • Five long-deprecated functions have been removed:

    • Image.interpretation/1 — use Image.colorspace/1.
    • Image.type/1 (was format/1) — use Image.band_format/1.
    • Image.convert_to_mask/1 — use Image.convert_alpha_to_mask/1.
    • Image.convert_to_mask!/1 — use Image.convert_alpha_to_mask!/1.
    • Image.map_pages/2 — use Image.map_join_pages/2.
  • Image.Color has been removed. Color handling now lives in two new modules and one new dependency:

  • Image.Classification and Image.Generation have moved to a new sibling package, :image_detection.

  • :bumblebee is no longer a dependency of :image. It is configured in the new library image_detection.

  • Image.Video is now backed by Xav (a thin Elixir wrapper around FFmpeg) instead of :evision / OpenCV. The public API surface is largely unchanged but the underlying type, options, and a few semantic details have moved:

    • The video struct is now %Image.Video{} (with fields :reader, :source, :fps, :duration_seconds, :frame_count, :width, :height) rather than %Evision.VideoCapture{}. Pattern-match on the new struct module if your code does so.

    • Image.Video.open/2's :backend option has been removed. FFmpeg picks the demuxer automatically and there is no concept of pluggable backends in Xav.

    • Image.Video.known_backends/0, available_backends/0, known_backend?/1, known_backend_values/0, and available_backend?/1 have been removed for the same reason. Image.Options.Video (the module that owned the backend table) has been deleted.

    • Camera input is now opened via a platform-specific device path. :default_camera resolves to /dev/video0 on Linux, "0" (AVFoundation device 0) on macOS, and "video=0" on Windows. An integer camera index is mapped to the corresponding /dev/videoN (or platform equivalent). For non-default cameras you can also pass an explicit FFmpeg device string.

    • Frame-based seeking (Image.Video.seek/2 with frame: n, and Image.Video.image_from_video/2 with frame: n) is now implemented as a time-based seek to n / fps followed by zero or more next_frame calls. For most files this lands on the requested frame; for very inter-frame-compressed files FFmpeg may snap to the nearest preceding keyframe.

    • Image.Video.close/1 is now a no-op that returns {:ok, %Image.Video{reader: nil}}. Xav garbage-collects the underlying FFmpeg context, so explicit close is no longer necessary. The function is retained for source compatibility; subsequent operations on the closed struct return {:error, %Image.Error{reason: :video_closed}}.

    • Image and audio frames are decoded by FFmpeg + libswscale rather than by OpenCV's videoio backend. Pixel-exact comparisons against fixtures generated by the previous version will not match; the test fixture test/support/validate/video/video_sample_frame_0.png has been regenerated.

  • :xav is now an optional dependency. It requires FFmpeg ≥ 6.0 to be installed on the system. Add it to your mix.exs if you use Image.Video:

    {:xav, "~> 0.10", optional: true}
    
  • :evision is no longer needed for Image.Video. It is still required for Image.QRcode and for the Image.to_evision/2 / Image.from_evision/1 interop helpers, which are unchanged. The README's optional-dependency table reflects the new split.

... (truncated)

Commits
  • 7b0042b Use the updated colorspace names in Color 0.4.0
  • a09746d Edit changelog
  • dbb76c1 update readme and changelog
  • 3662acb Make sure all optional deps are code fenced
  • 6d5f13d Ensure optional deps are code fenced
  • 923e94a Correct xav dependencies
  • 1f840c9 ffmpeg, not fffmpeg
  • 89b7a59 Add ffmpeg to install requirements in CI
  • 800c686 Update changelog and reset version
  • 025c3d5 Remove image detection and related deps to image_detection lib
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [image](https://github.com/elixir-image/image) from 0.63.0 to 0.65.0.
- [Release notes](https://github.com/elixir-image/image/releases)
- [Changelog](https://github.com/elixir-image/image/blob/main/CHANGELOG.md)
- [Commits](elixir-image/image@v0.63.0...v0.65.0)

---
updated-dependencies:
- dependency-name: image
  dependency-version: 0.65.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file elixir Pull requests that update elixir code labels Apr 18, 2026
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a50025c1ad

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread mix.lock
"httpoison": {:hex, :httpoison, "2.3.0", "10eef046405bc44ba77dc5b48957944df8952cc4966364b3cf6aa71dce6de587", [:mix], [{:hackney, "~> 1.21", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "d388ee70be56d31a901e333dbcdab3682d356f651f93cf492ba9f06056436a2c"},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"image": {:hex, :image, "0.63.0", "03efcfeb1cfaac10d6ab364acce2bfa35e6b33b08947f291fdc17df796b36226", [:mix], [{:bumblebee, "~> 0.6", [hex: :bumblebee, repo: "hexpm", optional: true]}, {:evision, "~> 0.1.33 or ~> 0.2", [hex: :evision, repo: "hexpm", optional: true]}, {:exla, "~> 0.9", [hex: :exla, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}, {:kino, "~> 0.13", [hex: :kino, repo: "hexpm", optional: true]}, {:nx, "~> 0.10", [hex: :nx, repo: "hexpm", optional: true]}, {:nx_image, "~> 0.1", [hex: :nx_image, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.1 or ~> 3.2 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: true]}, {:req, "~> 0.4", [hex: :req, repo: "hexpm", optional: true]}, {:rustler, "> 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:scholar, "~> 0.3", [hex: :scholar, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: false]}, {:vix, "~> 0.33", [hex: :vix, repo: "hexpm", optional: false]}], "hexpm", "63b39a312f889bb61a04a4957977a7cd3fa23974ff56de3feebf46f69c5fa60e"},
"image": {:hex, :image, "0.65.0", "44908233a1a0dcdbb6ae873ec09fd9ae533d1840d300d8b0b1b186d586b935e6", [:mix], [{:color, "~> 0.4", [hex: :color, repo: "hexpm", optional: false]}, {:evision, "~> 0.1.33 or ~> 0.2", [hex: :evision, repo: "hexpm", optional: true]}, {:exla, "0.11.0", [hex: :exla, repo: "hexpm", optional: true]}, {:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: true]}, {:kino, "~> 0.13", [hex: :kino, repo: "hexpm", optional: true]}, {:nx, "~> 0.11.0", [hex: :nx, repo: "hexpm", optional: true]}, {:nx_image, "~> 0.1", [hex: :nx_image, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.1 or ~> 3.2 or ~> 4.0", [hex: :phoenix_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.13", [hex: :plug, repo: "hexpm", optional: true]}, {:req, "~> 0.4", [hex: :req, repo: "hexpm", optional: true]}, {:rustler, "> 0.0.0", [hex: :rustler, repo: "hexpm", optional: true]}, {:scholar, "~> 0.3", [hex: :scholar, repo: "hexpm", optional: true]}, {:sweet_xml, "~> 0.7", [hex: :sweet_xml, repo: "hexpm", optional: false]}, {:vix, "~> 0.33", [hex: :vix, repo: "hexpm", optional: false]}, {:xav, "~> 0.10", [hex: :xav, repo: "hexpm", optional: true]}], "hexpm", "d2060e08d0f42564f49de1ea97a82a5d237f9ac91edb141dece51f1238dd8b4a"},
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Add xav when bumping image to 0.65

This lock update moves image to 0.65.0, where video handling depends on the optional :xav backend, but mix.lock still has no resolved "xav" package entry. The app actively uses Image.Video.with_video/2 and Image.Video.image_from_video/2 in apps/nft_media_handler/lib/nft_media_handler.ex (video thumbnail path), so video NFT processing will fail at runtime instead of producing thumbnails unless :xav is added as a direct dependency.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file elixir Pull requests that update elixir code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants