<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="351224" data-post-id="351224">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="greven" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/greven/120/25004_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  greven
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Credits where credit is due, but you are doing an amazing work yourself. Your API design is on point and there is a lot of merit in creating higher level abstractions to turn more complex libraries/API into an accessible package. <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="351224" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/173">Post #172</a>
	                </div>
	            </div>
              <div id="likers-container-351224" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="351224"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #172"></div>
  </section>
</div>
    <div class="postbit" id="351234" data-post-id="351234">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="jc00ke" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/jc00ke/120/18365_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  jc00ke
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>You are 100% right! Thank you to <a class="mention" href="/u/akash-akya" rel="nofollow">@akash-akya</a> and <a class="mention" href="/u/cocoa" rel="nofollow">@cocoa</a> for their immediate Elixir work and to Dr. Cupitt who has done some amazing work!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="351234" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/174">Post #173</a>
	                </div>
	            </div>
              <div id="likers-container-351234" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="351234"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #173"></div>
  </section>
</div>
    <div class="postbit" id="361524" data-post-id="361524">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="marschro" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/marschro/120/23466_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  marschro
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Absolutely great library!!! Thanks !!!</p>
<p>Currently <code>Image.Video.with_video/2</code> is only working with a path.<br>
I have a video as binary, just downloaded from ObjectStorage with <code>ExAws</code> …</p>
<p>Is it best approach, to just write it temporarily to the disk and work on this? Or is there another better approach?<br>
The only Thing I need, is to extract a poster image from the video. I then can get rid of the downloaded video again…</p>
<p>cheers!<br>
Martin</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="361524" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/175">Post #174</a>
	                </div>
	            </div>
              <div id="likers-container-361524" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="361524"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #174"></div>
  </section>
</div>
    <div class="postbit" id="361581" data-post-id="361581">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="kip" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kip/120/1440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  kip
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>ex_cldr Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Glad you’re finding value in <code>image</code> and <code>vix</code>!</p>
<p>The <code>Image.Video</code> module is a wrapper around <a href="https://hexdocs.pm/evision/Evision.VideoCapture.html" rel="nofollow">Evision.VideoCapture</a> and the functions there work only on a path, a device (like a camera) or an RTSP video stream. Not a raw binary.</p>
<p>You might find that either <a href="https://hex.pm/packages/membrane" rel="nofollow">membrane</a> or <a href="https://github.com/elixir-webrtc/xav" rel="nofollow">xav</a>  provide a closer API fit to what you are looking for.</p>
<p>I would like to be able to do more - and do it more easily - than the video capabilities of OpenCV and I plan to look at how to integrate <code>xav</code> at some (undefined) time in the future.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="361581" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/176">Post #175</a>
	                </div>
	            </div>
              <div id="likers-container-361581" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="361581"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #175"></div>
  </section>
</div>
    <div class="postbit" id="361596" data-post-id="361596">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="marschro" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/marschro/120/23466_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  marschro
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Thank you <a class="mention" href="/u/kip" rel="nofollow">@kip</a> for your hints.<br>
I then just store the video temporarily, do the stuff needed and trash it after.<br>
That‘s totally fine. Just thought might have overseen sth. similar to Image.from_binary or so…</p>
<p>Best,<br>
Martin</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="361596" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/177">Post #176</a>
	                </div>
	            </div>
              <div id="likers-container-361596" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="361596"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #176"></div>
  </section>
</div>
    <div class="postbit" id="361831" data-post-id="361831">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Neophen" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Neophen/120/20004_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Neophen
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Hey i’m having an issue with Trying to use <code>Image.rounded!</code>, when trying to compose it with other images, as it adds another band to images with a transparancy?</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">     ** (Image.Error) operation build: composite2: images do not have same numbers of bands
</code></pre>
<p>Would this be a good a workaround?</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">  defp rounded_full(image) do
    image = Image.rounded!(image)

    case Image.bands(image) do
      4 -&gt;
        image

      5 -&gt;
        # Image.rounded adds another band we then remove the alpha band
        [r, g, b, _a, mask] = Image.split_bands(image)
        # Recombine with mask as alpha
        {:ok, normalized} = Operation.bandjoin([r, g, b, mask])
        normalized

      other -&gt;
        raise "Unsupported band count: #{other}"
    end
  end
</code></pre> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="361831" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/178">Post #177</a>
	                </div>
	            </div>
              <div id="likers-container-361831" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="361831"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #177"></div>
  </section>
</div>
    <div class="postbit" id="361905" data-post-id="361905">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="kip" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kip/120/1440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  kip
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>ex_cldr Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Good call out, definitely a bug. Would you consider opening an issue?  I need to add logic to combine the existing alpha and the new alpha mask when an alpha band already exists. Just discarding the existing alpha band isn’t appropriate in many situations.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="361905" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/179">Post #178</a>
	                </div>
	            </div>
              <div id="likers-container-361905" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="361905"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #178"></div>
  </section>
</div>
    <div class="postbit" id="361937" data-post-id="361937">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="Neophen" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/Neophen/120/20004_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  Neophen
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="Neophen" data-post="178" data-topic="47568">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/neophen/48/20004_2.png" class="avatar"> Neophen:</div>
<blockquote>
<p>Hey i’m having an issue with Trying to use <code>Image.rounded!</code>, when trying to compose it with other images, as it adds another band to images with a transparancy?</p>
<pre data-code-wrap="elixir"><code class="lang-elixir">     ** (Image.Error) operation build: composite2: images do not have same numbers of bands
</code></pre>
</blockquote>
</aside>
<p>Thank you Kip, I’d have a look myself and do a pr but would not even have an idea of where to start <img src="https://forum.elixirforum.com/images/emoji/apple/smiley.png?v=15" title=":smiley:" class="emoji" alt=":smiley:" loading="lazy" width="20" height="20"></p>
<p><a href="https://github.com/elixir-image/image/issues/182" rel="noopener nofollow ugc">https://github.com/elixir-image/image/issues/182</a></p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="361937" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/180">Post #179</a>
	                </div>
	            </div>
              <div id="likers-container-361937" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="361937"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #179"></div>
  </section>
</div>
    <div class="postbit" id="386546" data-post-id="386546">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="kip" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kip/120/1440_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  kip
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
			          <div class="user-title">
									<span>ex_cldr Core Team</span>
			          </div>
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>I’ve published <a href="https://hex.pm/packages/image/0.64.0" rel="nofollow">image version 0.64.0</a>.</p>
<p>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 <a href="https://hex.pm/packages/color" rel="nofollow">color</a>) and objective classification and detection has been removed to a new <code>image_detection</code> library. Video frame extractions is now using <a href="https://hex.pm/packages/xav" rel="nofollow">Xav</a> rather than <code>eVision</code>.</p>
<p>As a result, there are quite a few breaking changes - and some new goodies. The breaking changes aren’t dramatic - but they are breaking.</p>
<p>Hopefully this is the last pre-release before 1.0. Feedback on this release will determine that outcome!</p>
<h3><a name="p-386546-breaking-changes-1" class="anchor" href="#p-386546-breaking-changes-1" aria-label="Heading link" rel="nofollow"></a>Breaking Changes</h3>
<ul>
<li>
<p>Five long-deprecated functions have been removed:</p>
<ul>
<li><code>Image.interpretation/1</code> — use <code>Image.colorspace/1</code>.</li>
<li><code>Image.type/1</code> (was <code>format/1</code>) — use <code>Image.band_format/1</code>.</li>
<li><code>Image.convert_to_mask/1</code> — use <code>Image.convert_alpha_to_mask/1</code>.</li>
<li><code>Image.convert_to_mask!/1</code> — use <code>Image.convert_alpha_to_mask!/1</code>.</li>
<li><code>Image.map_pages/2</code> — use <code>Image.map_join_pages/2</code>.</li>
</ul>
</li>
<li>
<p><code>Image.Color</code> has been removed. Color handling now lives in two new modules and one new dependency:</p>
</li>
<li>
<p><code>Image.Classification</code> and <code>Image.Generation</code> have moved to a new sibling package, <a href="https://hex.pm/packages/image_detection" rel="nofollow"><code>:image_detection</code></a>.</p>
</li>
<li>
<p><code>:bumblebee</code> is no longer a dependency of <code>:image</code>. It is configured in the new library <code>image_detection</code>.</p>
</li>
<li>
<p><code>Image.Video</code> is now backed by <a href="https://hex.pm/packages/xav" rel="nofollow">Xav</a> (a thin Elixir wrapper around FFmpeg) instead of <code>:evision</code> / OpenCV. The public API surface is largely unchanged but the underlying type, options, and a few semantic details have moved:</p>
<ul>
<li>
<p>The video struct is now <code>%Image.Video{}</code> (with fields <code>:reader</code>, <code>:source</code>, <code>:fps</code>, <code>:duration_seconds</code>, <code>:frame_count</code>, <code>:width</code>, <code>:height</code>) rather than <code>%Evision.VideoCapture{}</code>. Pattern-match on the new struct module if your code does so.</p>
</li>
<li>
<p><code>Image.Video.open/2</code>’s <code>:backend</code> option has been removed. FFmpeg picks the demuxer automatically and there is no concept of pluggable backends in Xav.</p>
</li>
<li>
<p><code>Image.Video.known_backends/0</code>, <code>available_backends/0</code>, <code>known_backend?/1</code>, <code>known_backend_values/0</code>, and <code>available_backend?/1</code> have been removed for the same reason. <code>Image.Options.Video</code> (the module that owned the backend table) has been deleted.</p>
</li>
<li>
<p>Camera input is now opened via a platform-specific device path. <code>:default_camera</code> resolves to <code>/dev/video0</code> on Linux, <code>"0"</code> (AVFoundation device 0) on macOS, and <code>"video=0"</code> on Windows. An integer camera index is mapped to the corresponding <code>/dev/videoN</code> (or platform equivalent). For non-default cameras you can also pass an explicit FFmpeg device string.</p>
</li>
<li>
<p>Frame-based seeking (<code>Image.Video.seek/2</code> with <code>frame: n</code>, and <code>Image.Video.image_from_video/2</code> with <code>frame: n</code>) is now implemented as a time-based seek to <code>n / fps</code> followed by zero or more <code>next_frame</code> calls. For most files this lands on the requested frame; for very inter-frame-compressed files FFmpeg may snap to the nearest preceding keyframe.</p>
</li>
<li>
<p><code>Image.Video.close/1</code> is now a no-op that returns <code>{:ok, %Image.Video{reader: nil}}</code>. 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 <code>{:error, %Image.Error{reason: :video_closed}}</code>.</p>
</li>
<li>
<p>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 <code>test/support/validate/video/video_sample_frame_0.png</code> has been regenerated.</p>
</li>
</ul>
</li>
<li>
<p><code>:xav</code> is now an optional dependency. It requires FFmpeg ≥ 6.0 to be installed on the system. Add it to your <code>mix.exs</code> if you use <code>Image.Video</code>:</p>
<pre><code>{:xav, "~&gt; 0.10", optional: true}
</code></pre>
</li>
<li>
<p><code>:evision</code> is no longer needed for <code>Image.Video</code>. It is still required for <code>Image.QRcode</code> and for the <code>Image.to_evision/2</code> / <code>Image.from_evision/1</code> interop helpers, which are unchanged. The README’s optional-dependency table reflects the new split.</p>
</li>
<li>
<p><code>Image.Error</code> is now a structured public exception. It carries <code>:reason</code> (atom or <code>{atom, value}</code> tuple), <code>:operation</code>, <code>:path</code>, <code>:value</code>, and a derived <code>:message</code>. Every fallible function in the library now returns <code>{:ok, value}</code> or <code>{:error, %Image.Error{}}</code> — bare-string error tuples have been eliminated. Bang variants raise the same struct. The new <code>Image.Error.wrap/2</code> helper attaches structured context to a raw libvips or <code>File.*</code> error. Pattern-match on <code>:reason</code> instead of scraping <code>:message</code>:</p>
<pre><code>case Image.open(path) do
  {:ok, image} -&gt; ...
  {:error, %Image.Error{reason: :enoent}} -&gt; not_found_handler()
  {:error, %Image.Error{} = err} -&gt; raise err
end
</code></pre>
</li>
</ul>
<h3><a name="p-386546-enhancements-2" class="anchor" href="#p-386546-enhancements-2" aria-label="Heading link" rel="nofollow"></a>Enhancements</h3>
<ul>
<li>
<p><code>Image.dominant_color/2</code> now accepts a <code>:method</code> option of either <code>:histogram</code> (the existing default) or <code>:imagequant</code>. The <code>:imagequant</code> method routes through <code>libimagequant</code> (via <code>vips_gifsave_buffer</code>) and returns a palette of <code>{r, g, b}</code> tuples ordered by perceptual importance. New <code>:effort</code> and <code>:dither</code> options tune the quantiser. See <code>guides/performance.md</code> for a comparison of the two methods.</p>
</li>
<li>
<p>Colour arguments to drawing, embedding, trimming, gradient, chroma key, comparison, warp-perspective, meme, replace-colour, flatten, and <code>if_then_else</code> operations are now correctly converted to the target image’s colour space. Drawing <code>:red</code> on a Lab image now produces actual Lab red, not the bytes <code>[255, 0, 0]</code> reinterpreted as Lab.</p>
</li>
<li>
<p>New <code>Image.Pixel</code> and <code>Image.ICCProfile</code> modules. <code>Image.Pixel.to_pixel/3</code> is the canonical way to turn any user-friendly colour input into a libvips-ready pixel for a particular image; <code>Image.Pixel.to_srgb/1</code> is the image-independent equivalent for callers (SVG renderers, gradients) that need a fixed sRGB output.</p>
</li>
<li>
<p>The <code>:color</code> library is now a dependency of <code>:image</code>. It is now the canonical colour science layer for the project.</p>
</li>
<li>
<p><code>Image.Video</code> now supports HTTP/HTTPS/RTSP/RTMP URLs as video sources for free, since FFmpeg supports them natively.</p>
</li>
<li>
<p><code>Image.xav_configured?/0</code> is the new compile-time predicate that gates the <code>Image.Video</code> module (analogous to <code>Image.evision_configured?/0</code> and <code>Image.bumblebee_configured?/0</code>).</p>
</li>
<li>
<p>The <code>Image.Video.frame_to_image/1</code> helper exposes the raw <code>Xav.Frame</code> → <code>Vix.Vips.Image.t()</code> conversion (used internally by <code>image_from_video/2</code> and <code>stream!/2</code>). Useful if you have a frame from elsewhere in the Xav ecosystem and want to bring it into <code>Image</code>.</p>
</li>
</ul> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="386546" data-batch-url="/posts/batch_likers">
                        11
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/181">Post #180</a>
	                </div>
	            </div>
              <div id="likers-container-386546" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="386546"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #180"></div>
  </section>
</div>
    <div class="postbit" id="386554" data-post-id="386554">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="kevinschweikert" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/kevinschweikert/120/26866_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  kevinschweikert
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p><a class="mention" href="/u/kip" rel="nofollow">@kip</a> this is an amazing release! Love the transition to <code>xav</code>! Thank you for all your hard work!</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="386554" data-batch-url="/posts/batch_likers">
                        0
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/image-an-image-processing-library-based-upon-vix/47568/182">Post #181</a>
	                </div>
	            </div>
              <div id="likers-container-386554" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="386554"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #181"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <a class="load-more-button" data-turbo-stream="true" href="/topics/47568/load_more?page=19">Load more posts (14 remaining)</a>
</div></template></turbo-stream>