<?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>John&#039;s Blog &#187; thumbnail</title>
	<atom:link href="http://john.nachtimwald.com/tag/thumbnail/feed/" rel="self" type="application/rss+xml" />
	<link>http://john.nachtimwald.com</link>
	<description>My little blog</description>
	<lastBuildDate>Sun, 29 Jan 2012 21:31:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Cybook t4b Format Specification</title>
		<link>http://john.nachtimwald.com/2010/01/13/cybook-t4b-format-specification/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cybook-t4b-format-specification</link>
		<comments>http://john.nachtimwald.com/2010/01/13/cybook-t4b-format-specification/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 02:09:23 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[cybook]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[pgm]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[t2b]]></category>
		<category><![CDATA[t4b]]></category>
		<category><![CDATA[thumbnail]]></category>

		<guid isPermaLink="false">http://john.nachtimwald.com/?p=349</guid>
		<description><![CDATA[The new epub thumbnail files (.epub.thn) are what Bookeen calls t4b files. They are very similar to the older t2b thumbnail files they were using in earlier versions of the Cybook firmware. As the name suggests instead of using 2 bits to represent color values 4 bits are now used. This increases the number of [...]]]></description>
			<content:encoded><![CDATA[<p>The new epub thumbnail files (.epub.thn) are what Bookeen calls t4b files. They are very similar to the older <a href="http://john.nachtimwald.com/2009/01/19/cybook-t2b-format-specification/">t2b</a> thumbnail files they were using in earlier versions of the Cybook firmware. As the name suggests instead of using 2 bits to represent color values 4 bits are now used. This increases the number of colors from 4 to 16. In addition to the increased color range the t4b files now require a header of &#8220;t4bp&#8221; without the quotes.</p>
<p>The image’s dimensions are 96×144. The bits representing 0, 1, 2, 3&#8230; are written directly to the file. it is very similar to a pgm file in this regard. Each 4 bit sequence represents a pixel color. Only black, white and shades of gray are supported.</p>
<p>Every t4b file will have 13,824 pixels. The file size will always be 6,916 bytes. The formula to determine this is: (height x width x 2 bits per pixel) / 8 bits per byte. ((96 * 144 * 4) / 8 ) + 4 = 6,916. The + 4 is the header.</p>
<p>Following are two python scripts for converting an image to a t4b file and for converting a t4b file into a <a href="http://netpbm.sourceforge.net/doc/pgm.html">pgm image</a>.</p>
<p>image2t4b.py</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>, Image
&nbsp;
REDUCE_MARKS = <span style="color: black;">&#91;</span><span style="color: #ff4500;">16</span>, <span style="color: #ff4500;">32</span>, <span style="color: #ff4500;">48</span>, <span style="color: #ff4500;">64</span>, <span style="color: #ff4500;">80</span>, <span style="color: #ff4500;">96</span>, <span style="color: #ff4500;">112</span>, <span style="color: #ff4500;">128</span>, <span style="color: #ff4500;">144</span>, <span style="color: #ff4500;">160</span>, <span style="color: #ff4500;">176</span>, <span style="color: #ff4500;">192</span>, <span style="color: #ff4500;">208</span>, <span style="color: #ff4500;">224</span>, <span style="color: #ff4500;">240</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> reduce_color<span style="color: black;">&#40;</span>c<span style="color: black;">&#41;</span>:
    val = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> mark <span style="color: #ff7700;font-weight:bold;">in</span> REDUCE_MARKS:
        <span style="color: #ff7700;font-weight:bold;">if</span> c <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span> mark:
            val += <span style="color: #ff4500;">1</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            <span style="color: #ff7700;font-weight:bold;">break</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> val
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">3</span>:
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">Exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Must have 2 arguments. %s input.image output.epub.thn'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
    outf = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'wb'</span><span style="color: black;">&#41;</span>
&nbsp;
    im = Image.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>.<span style="color: black;">convert</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;L&quot;</span><span style="color: black;">&#41;</span>
    im.<span style="color: black;">thumbnail</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">96</span>, <span style="color: #ff4500;">144</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    newim = Image.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'L'</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">96</span>, <span style="color: #ff4500;">144</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'white'</span><span style="color: black;">&#41;</span>
&nbsp;
    x,y = im.<span style="color: black;">size</span>
    newim.<span style="color: black;">paste</span><span style="color: black;">&#40;</span>im, <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">96</span>-x<span style="color: black;">&#41;</span>/<span style="color: #ff4500;">2</span>, <span style="color: black;">&#40;</span><span style="color: #ff4500;">144</span>-y<span style="color: black;">&#41;</span>/<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    outf.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'t4bp'</span><span style="color: black;">&#41;</span>
&nbsp;
    px = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> p <span style="color: #ff7700;font-weight:bold;">in</span> newim.<span style="color: black;">getdata</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        px.<span style="color: black;">append</span><span style="color: black;">&#40;</span>p<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>px<span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
            byte_val = bin<span style="color: black;">&#40;</span>reduce_color<span style="color: black;">&#40;</span>px<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">zfill</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span> + bin<span style="color: black;">&#40;</span>reduce_color<span style="color: black;">&#40;</span>px<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">zfill</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>
            outf.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #008000;">chr</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>byte_val, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            px = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">elif</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>px<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span> <span style="color: #ff4500;">2</span>:
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">Exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Fatal error px length increased past 2.'</span><span style="color: black;">&#41;</span>
&nbsp;
    outf.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>t4b2pgm.py</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">os</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> get_greys<span style="color: black;">&#40;</span>b<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> b:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>
&nbsp;
    b = bin<span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>b<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    b = b<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">zfill</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>
&nbsp;
    w = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>b<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:<span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    x = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>b<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span>:<span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> w, x
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">3</span>:
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #008000;">Exception</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Must have 2 arguments. %s input.epub.thm output.pgm'</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
    t4bfile = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'rb'</span><span style="color: black;">&#41;</span>
    pgmfile = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>
&nbsp;
    pgmfile.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'P2<span style="color: #000099; font-weight: bold;">\n</span>96 144<span style="color: #000099; font-weight: bold;">\n</span>15<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Read past the t4b header</span>
    t4bfile.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">144</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">48</span><span style="color: black;">&#41;</span>:
            b = t4bfile.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
            vals = get_greys<span style="color: black;">&#40;</span>b<span style="color: black;">&#41;</span>
            pgmfile.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s %s '</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>vals<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, vals<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        pgmfile.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span>
&nbsp;
    pgmfile.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    t4bfile.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://john.nachtimwald.com/2010/01/13/cybook-t4b-format-specification/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cybook 2.0 Thumbnail Observations</title>
		<link>http://john.nachtimwald.com/2010/01/13/cybook-2-0-thumbnail-observations/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=cybook-2-0-thumbnail-observations</link>
		<comments>http://john.nachtimwald.com/2010/01/13/cybook-2-0-thumbnail-observations/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 00:38:51 +0000</pubDate>
		<dc:creator>John</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[cybook]]></category>
		<category><![CDATA[gadgets]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[thumbnail]]></category>

		<guid isPermaLink="false">http://john.nachtimwald.com/?p=346</guid>
		<description><![CDATA[The 2.0 fimware for the Cybook and Opus have new thumbnails for epub files. They use the .thn extension and it is append after the .epub extension. This is unlike the _6090.t2b thumbnails which use the book name without the extension and _6090.t2b appended to it. I have yet to start figuring out this new [...]]]></description>
			<content:encoded><![CDATA[<p>The 2.0 fimware for the Cybook and Opus have new thumbnails for epub files. They use the .thn extension and it is append after the .epub extension. This is unlike the _6090.t2b thumbnails which use the book name without the extension and _6090.t2b appended to it. I have yet to start figuring out this new format but at first glance it looks to be similar to the _6090.t2b files.</p>
<p>What I have found is, if a _6090.t2b file is present that will be used and the .thn file will not be generated and the _6090.t2b will be used as the thumbnail. However, if both the _6090.t2b and .thn are present then the .thn will be used.</p>
]]></content:encoded>
			<wfw:commentRss>http://john.nachtimwald.com/2010/01/13/cybook-2-0-thumbnail-observations/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

