<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Imageio on RawCull</title><link>https://techrawcull.netlify.app/tags/imageio/</link><description>Recent content in Imageio on RawCull</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 30 Jul 2026 08:19:52 +0200</lastBuildDate><atom:link href="https://techrawcull.netlify.app/tags/imageio/index.xml" rel="self" type="application/rss+xml"/><item><title>How RawParserKit Is Constructed</title><link>https://techrawcull.netlify.app/docs/packages/rawparserkit/</link><pubDate>Thu, 30 Jul 2026 00:00:00 +0000</pubDate><guid>https://techrawcull.netlify.app/docs/packages/rawparserkit/</guid><description>&lt;h1 id="how-rawparserkit-is-constructed"&gt;How RawParserKit Is Constructed&lt;a class="td-heading-self-link" href="#how-rawparserkit-is-constructed" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;RawParserKit is RawCull&amp;rsquo;s camera-file boundary. It knows how Sony ARW and Nikon
NEF files are structured, how to locate their embedded JPEGs and AF metadata,
and how to turn those sources into orientation-normalized images and
display-ready metadata.&lt;/p&gt;
&lt;p&gt;The package stops at decoding. It does not score sharpness, generate embeddings,
group bursts, cache application results, or decide which photo should be kept.&lt;/p&gt;
&lt;h2 id="1-begin-with-the-package-boundary"&gt;1. Begin With The Package Boundary&lt;a class="td-heading-self-link" href="#1-begin-with-the-package-boundary" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;RawParserKit owns:&lt;/p&gt;</description></item><item><title>Synchronous Code</title><link>https://techrawcull.netlify.app/docs/heavy/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>https://techrawcull.netlify.app/docs/heavy/</guid><description>&lt;h1 id="synchronous-code"&gt;Synchronous Code&lt;a class="td-heading-self-link" href="#synchronous-code" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;Most RawCull code uses async/await, actors, and task groups. Some Apple framework work is still fundamentally synchronous: ImageIO thumbnail decode, CoreImage RAW rendering, JPEG encoding, and direct binary MakerNote parsing. This page explains where that work lives and how the app keeps it from freezing the UI or starving Swift&amp;rsquo;s cooperative executor.&lt;/p&gt;
&lt;h2 id="source-map"&gt;Source Map&lt;a class="td-heading-self-link" href="#source-map" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Area&lt;/th&gt;
					&lt;th&gt;Files&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Cancellation-aware blocking bridge&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;RawParserKit/Sources/RawParserKit/CancellableImageIOWork.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Thumbnail extraction&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;SonyThumbnailExtractor.swift&lt;/code&gt;, &lt;code&gt;NikonThumbnailExtractor.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Embedded JPEG extraction&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;JPGSonyARWExtractor.swift&lt;/code&gt;, &lt;code&gt;JPGNikonNEFExtractor.swift&lt;/code&gt;, &lt;code&gt;SonyRAWJPEGCreator.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;MakerNote parsing&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;SonyMakerNoteParser.swift&lt;/code&gt;, &lt;code&gt;NikonMakerNoteParser.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;App callers&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;RequestThumbnail.swift&lt;/code&gt;, &lt;code&gt;ScanAndCreateThumbnails.swift&lt;/code&gt;, &lt;code&gt;ExtractAndSaveJPGs.swift&lt;/code&gt;, &lt;code&gt;ScanAndExtractJPGs.swift&lt;/code&gt;, &lt;code&gt;ZoomPreviewHandler.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Sharpness scoring&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;FocusMaskEngine+Scoring.swift&lt;/code&gt;, &lt;code&gt;FocusMaskEngine+MaskGeneration.swift&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="why-blocking-work-matters"&gt;Why Blocking Work Matters&lt;a class="td-heading-self-link" href="#why-blocking-work-matters" aria-label="Heading self-link"&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Swift&amp;rsquo;s cooperative thread pool expects async tasks to suspend instead of occupying threads for long periods. ImageIO and CoreImage calls often do not suspend; they block until decode/render work is done.&lt;/p&gt;</description></item></channel></rss>