<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>richardjdare.com &#187; png</title>
	<atom:link href="http://richardjdare.com/blog/tag/png/feed/" rel="self" type="application/rss+xml" />
	<link>http://richardjdare.com</link>
	<description>Games, Ideas, Imagination</description>
	<lastBuildDate>Thu, 06 Apr 2023 12:02:17 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Getting the size of a PNG without loading it</title>
		<link>http://richardjdare.com/blog/2010/10/getting-the-size-of-a-png-without-loading-it/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=getting-the-size-of-a-png-without-loading-it</link>
		<comments>http://richardjdare.com/blog/2010/10/getting-the-size-of-a-png-without-loading-it/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 13:37:21 +0000</pubDate>
		<dc:creator><![CDATA[Richard Dare]]></dc:creator>
				<category><![CDATA[game development]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[objective c]]></category>
		<category><![CDATA[png]]></category>

		<guid isPermaLink="false">http://richardjdare.com/blog/?p=33</guid>
		<description><![CDATA[My current iPhone game (more info coming soon, I promise!) has a resource system that allows me to load texture maps when I need them.]]></description>
				<content:encoded><![CDATA[<p>My current iPhone game (more info coming soon, I promise!) has a resource system that allows me to load texture maps when I need them and unload them when I don’t. This helps makes the game very memory efficient, but it had one annoying flaw. At program startup I had to load and unload several textures to get size information I needed to set up other game structures. To avoid this wasteful operation I started looking at ways to extract information from a png without loading the whole thing.</p>
<p>This <a href="http://stackoverflow.com/questions/1551300/get-size-of-image-without-loading-in-to-memory">StackOverflow discussion</a> was useful, along with this <a href="http://www.w3.org/TR/PNG/">guide to the png format</a> from the W3C, but unfortunately, Apple threw a spanner in the works.</p>
<p>If you’ve been programming the iPhone for a while you’ll know that by default, Xcode premultiplies the alpha channel of PNG files before adding them to the application bundle. It also adds its own undocumented data chunk to the beginning of the file, breaking PNG guidelines which state that the IHDR chunk should always be at the beginning.</p>
<p>This Objective C function will return the size of an image for both standard and Apple PNGs. It scans through the file looking for the IHDR chunk, making no assumptions about its position. It should be easy enough to convert to other members of the C family.</p>
<div style="margin-top:32px;">
<style>
.wp_syntax{overflow-y:auto;max-height:400px};
</style>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#include &lt;stdio.h&gt;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//----------------------------------------------------------------------------</span>
<span style="color: #11740a; font-style: italic;">// GetPNGSize() - gets PNG Dimensions without loading any data</span>
<span style="color: #11740a; font-style: italic;">//----------------------------------------------------------------------------</span>
<span style="color: #a61390;">BOOL</span> GetPNGSize<span style="color: #002200;">&#40;</span><span style="color: #a61390;">const</span> <span style="color: #a61390;">char</span> <span style="color: #002200;">*</span>fileName,CGSize <span style="color: #002200;">*</span>pngSize<span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
    <span style="color: #11740a; font-style: italic;">// PNG Signature</span>
    <span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span> png_signature<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">8</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">=</span> <span style="color: #002200;">&#123;</span><span style="color: #2400d9;">137</span>, <span style="color: #2400d9;">80</span>, <span style="color: #2400d9;">78</span>, <span style="color: #2400d9;">71</span>, <span style="color: #2400d9;">13</span>, <span style="color: #2400d9;">10</span>, <span style="color: #2400d9;">26</span>, <span style="color: #2400d9;">10</span><span style="color: #002200;">&#125;</span>;
    <span style="color: #11740a; font-style: italic;">// IHDR chunk identifier</span>
    <span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span> ihdr_signature<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">4</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">=</span><span style="color: #002200;">&#123;</span><span style="color: #bf1d1a;">'I'</span>,<span style="color: #bf1d1a;">'H'</span>,<span style="color: #bf1d1a;">'D'</span>,<span style="color: #bf1d1a;">'R'</span><span style="color: #002200;">&#125;</span>;
&nbsp;
    <span style="color: #a61390;">FILE</span> <span style="color: #002200;">*</span>fp;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span> <span style="color: #002200;">&#40;</span>fp <span style="color: #002200;">=</span> <span style="color: #a61390;">fopen</span><span style="color: #002200;">&#40;</span>fileName,<span style="color: #bf1d1a;">&quot;rb&quot;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">==</span> <span style="color: #a61390;">NULL</span> <span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">NO</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">// load png signature and check it</span>
    <span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span> sigBuf<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">8</span><span style="color: #002200;">&#93;</span>;
    <span style="color: #a61390;">fread</span><span style="color: #002200;">&#40;</span>sigBuf, <span style="color: #2400d9;">1</span>, <span style="color: #2400d9;">8</span>, fp<span style="color: #002200;">&#41;</span>;
&nbsp;
    <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">memcmp</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&amp;</span>sigBuf<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>, <span style="color: #002200;">&amp;</span>png_signature<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>, <span style="color: #2400d9;">8</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #a61390;">fclose</span><span style="color: #002200;">&#40;</span>fp<span style="color: #002200;">&#41;</span>;
        <span style="color: #a61390;">return</span> <span style="color: #a61390;">NO</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
    <span style="color: #11740a; font-style: italic;">// examine chunks until we find IHDR</span>
    <span style="color: #a61390;">BOOL</span> done <span style="color: #002200;">=</span> <span style="color: #a61390;">NO</span>;
    <span style="color: #a61390;">while</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>done <span style="color: #002200;">&amp;&amp;</span> <span style="color: #002200;">!</span><span style="color: #a61390;">feof</span><span style="color: #002200;">&#40;</span>fp<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
        <span style="color: #11740a; font-style: italic;">// get chunk length and type</span>
        <span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span> chunkInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">8</span><span style="color: #002200;">&#93;</span>;
        <span style="color: #a61390;">fread</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&amp;</span>chunkInfo, <span style="color: #2400d9;">1</span>, <span style="color: #2400d9;">8</span>, fp<span style="color: #002200;">&#41;</span>;
&nbsp;
        <span style="color: #a61390;">long</span> length <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>chunkInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">24</span><span style="color: #002200;">&#41;</span> | <span style="color: #002200;">&#40;</span>chunkInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">16</span><span style="color: #002200;">&#41;</span> | <span style="color: #002200;">&#40;</span>chunkInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">2</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">8</span><span style="color: #002200;">&#41;</span> | chunkInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">3</span><span style="color: #002200;">&#93;</span>;
&nbsp;
        <span style="color: #11740a; font-style: italic;">// is this the IHDR?</span>
        <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span><span style="color: #a61390;">memcmp</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&amp;</span>chunkInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">4</span><span style="color: #002200;">&#93;</span>, <span style="color: #002200;">&amp;</span>ihdr_signature<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>, <span style="color: #2400d9;">4</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>
        <span style="color: #002200;">&#123;</span>
            <span style="color: #a61390;">unsigned</span> <span style="color: #a61390;">char</span> sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">8</span><span style="color: #002200;">&#93;</span>;
            <span style="color: #a61390;">fread</span><span style="color: #002200;">&#40;</span>sizeInfo,<span style="color: #2400d9;">1</span>,<span style="color: #2400d9;">8</span>,fp<span style="color: #002200;">&#41;</span>;
&nbsp;
            pngSize<span style="color: #002200;">-</span>&gt;width <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">24</span><span style="color: #002200;">&#41;</span> | <span style="color: #002200;">&#40;</span>sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">16</span><span style="color: #002200;">&#41;</span> | <span style="color: #002200;">&#40;</span>sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">2</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">8</span><span style="color: #002200;">&#41;</span> | sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">3</span><span style="color: #002200;">&#93;</span>; 
            pngSize<span style="color: #002200;">-</span>&gt;height<span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">4</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">24</span><span style="color: #002200;">&#41;</span> | <span style="color: #002200;">&#40;</span>sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">5</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">16</span><span style="color: #002200;">&#41;</span> | <span style="color: #002200;">&#40;</span>sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">6</span><span style="color: #002200;">&#93;</span> &lt;&lt; <span style="color: #2400d9;">8</span><span style="color: #002200;">&#41;</span> | sizeInfo<span style="color: #002200;">&#91;</span><span style="color: #2400d9;">7</span><span style="color: #002200;">&#93;</span>;
            done <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;
        <span style="color: #002200;">&#125;</span>
        <span style="color: #a61390;">else</span> 
        <span style="color: #002200;">&#123;</span>
            <span style="color: #11740a; font-style: italic;">// skip over the data and checksum and go to next chunk</span>
            <span style="color: #a61390;">fseek</span><span style="color: #002200;">&#40;</span>fp, length<span style="color: #002200;">+</span><span style="color: #2400d9;">4</span> , <span style="color: #a61390;">SEEK_CUR</span><span style="color: #002200;">&#41;</span>;
        <span style="color: #002200;">&#125;</span>
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">fclose</span><span style="color: #002200;">&#40;</span>fp<span style="color: #002200;">&#41;</span>;
    <span style="color: #a61390;">return</span> done;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

</div>
]]></content:encoded>
			<wfw:commentRss>http://richardjdare.com/blog/2010/10/getting-the-size-of-a-png-without-loading-it/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
