<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: thumbnail code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 08 Aug 2008 16:16:40 GMT</pubDate>
    <description>DZone Snippets: thumbnail code</description>
    <item>
      <title>thumbnail with gd</title>
      <link>http://snippets.dzone.com/posts/show/3843</link>
      <description>Function that makes a thumbnail of a imagen and keeps it's proportion. $the fourth parameter ($fill) makes that, if the image is smaller than the size we want, the function expands it. It shows the image directly to the browser, but can be easily modificed to save the imagen on a directory.&lt;br /&gt;&lt;br /&gt;Funcion que hace una miniatura de una imagen manteniendo su proporcion individual. El cuarto parametro ($fill) hace que, si la imagen es mas peque&#241;a del tama&#241;o deseado, la expande. Muestra la imagen directamente en el navegador, pero puede ser facilmente modificada para guardarla en un directorio.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;?php&lt;br /&gt;function thumb($img, $w, $h, $fill = true) {&lt;br /&gt;	if (!extension_loaded('gd') &amp;&amp; !extension_loaded('gd2')) {&lt;br /&gt;		trigger_error("No dispones de la libreria GD para generar la imagen.", E_USER_WARNING);&lt;br /&gt;		return false;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	$imgInfo = getimagesize($img);&lt;br /&gt;	switch ($imgInfo[2]) {&lt;br /&gt;		case 1: $im = imagecreatefromgif($img); break;&lt;br /&gt;		case 2: $im = imagecreatefromjpeg($img);  break;&lt;br /&gt;		case 3: $im = imagecreatefrompng($img); break;&lt;br /&gt;		default:  trigger_error('Tipo de imagen no reconocido.', E_USER_WARNING);  break;&lt;br /&gt;	}&lt;br /&gt;&lt;br /&gt;	if ($imgInfo[0] &lt;= $w &amp;&amp; $imgInfo[1] &lt;= $h &amp;&amp; !$fill) {&lt;br /&gt;		$nHeight = $imgInfo[1];&lt;br /&gt;		$nWidth = $imgInfo[0];&lt;br /&gt;	}else{&lt;br /&gt;		if ($w/$imgInfo[0] &lt; $h/$imgInfo[1]) {&lt;br /&gt;			$nWidth = $w;&lt;br /&gt;			$nHeight = $imgInfo[1]*($w/$imgInfo[0]);&lt;br /&gt;		}else{&lt;br /&gt;			$nWidth = $imgInfo[0]*($h/$imgInfo[1]);&lt;br /&gt;			$nHeight = $h;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;  &lt;br /&gt;	$nWidth = round($nWidth);&lt;br /&gt;	$nHeight = round($nHeight);&lt;br /&gt;&lt;br /&gt;	$newImg = imagecreatetruecolor($nWidth, $nHeight);&lt;br /&gt;&lt;br /&gt;	imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $imgInfo[0], $imgInfo[1]);&lt;br /&gt;&lt;br /&gt;	header("Content-type: ". $imgInfo['mime']);&lt;br /&gt;&lt;br /&gt;	switch ($imgInfo[2]) {&lt;br /&gt;		case 1: imagegif($newImg); break;&lt;br /&gt;		case 2: imagejpeg($newImg);  break;&lt;br /&gt;		case 3: imagepng($newImg); break;&lt;br /&gt;		default:  trigger_error('Imposible mostrar la imagen.', E_USER_WARNING);  break;&lt;br /&gt;	}&lt;br /&gt;  &lt;br /&gt;	imagedestroy($newImg);&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Usage/Uso:&lt;br /&gt;thumb("image.png", 200, 200);</description>
      <pubDate>Fri, 20 Apr 2007 00:30:16 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3843</guid>
      <author>oso96_2000 (oso96_2000)</author>
    </item>
    <item>
      <title>Ruby Client for Amazon Alexa Site Thumbnail (AST) Service</title>
      <link>http://snippets.dzone.com/posts/show/3087</link>
      <description>It's scrappy, but it does the job.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;require 'cgi'&lt;br /&gt;require 'openssl'&lt;br /&gt;require 'base64'&lt;br /&gt;require 'open-uri'&lt;br /&gt;&lt;br /&gt;access_id = 'YOUR_ACCESS_ID'&lt;br /&gt;secret_id = 'YOUR_SECRET_ID'&lt;br /&gt;&lt;br /&gt;source_url = ARGV.first&lt;br /&gt;&lt;br /&gt;timestamp = Time.now.strftime("%Y-%m-%dT%H:%M:%SZ")&lt;br /&gt;sig = Base64.encode64(OpenSSL::HMAC::digest(OpenSSL::Digest::Digest.new('SHA1'), secret_id, 'Thumbnail' + timestamp)).strip&lt;br /&gt;&lt;br /&gt;url = "http://ast.amazonaws.com/Xino?Action=Thumbnail&amp;AWSAccessKeyId=" + access_id&lt;br /&gt;url &lt;&lt; "&amp;Signature=" + CGI.escape(sig)&lt;br /&gt;url &lt;&lt; "&amp;Timestamp=" + CGI.escape(timestamp)&lt;br /&gt;url &lt;&lt; "&amp;Url=" +  source_url&lt;br /&gt;&lt;br /&gt;begin&lt;br /&gt;  doc = open(url).read&lt;br /&gt;rescue&lt;br /&gt;  puts "Could not access AWS"&lt;br /&gt;  exit&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;m = doc.match(/\&lt;aws:thumbnail[^\&gt;]+exists=\"true\"\&gt;(.+?)\&lt;\//i)&lt;br /&gt;&lt;br /&gt;if m &amp;&amp; m[1]&lt;br /&gt;  thumb_url = m[1]&lt;br /&gt;  thumb_url.gsub!(/\&amp;amp;/, '&amp;')&lt;br /&gt;  File.open("#{source_url}.jpg", "w") { |f| f.write open(thumb_url).read }&lt;br /&gt;  puts "Saved to #{source_url}.jpg"&lt;br /&gt;elsif m &amp;&amp; m.match(/exists=\"false\"/)&lt;br /&gt;  puts "No thumbnail for #{source_url}"&lt;br /&gt;else&lt;br /&gt;  puts "Error"&lt;br /&gt;end&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Tue, 05 Dec 2006 18:31:27 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3087</guid>
      <author>peter (Peter Cooperx)</author>
    </item>
    <item>
      <title>PyS60 - Gallery Thumbnail Ver. 2</title>
      <link>http://snippets.dzone.com/posts/show/1683</link>
      <description>// Versione riveduta e corretta di Gallery Thumbnail postata da korakot ^_^&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import appuifw&lt;br /&gt;import e32&lt;br /&gt;import graphics&lt;br /&gt;import key_codes&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;class FlickrS60Error(Exception): pass&lt;br /&gt;&lt;br /&gt;class FlickrS60Thumb:&lt;br /&gt;&lt;br /&gt;	def __init__(self, path):&lt;br /&gt;&lt;br /&gt;		self.path = unicode(path)&lt;br /&gt;		self.listFile = []&lt;br /&gt;		self.ldivx = 0&lt;br /&gt;		self.ldivy = 0&lt;br /&gt;		self.lock = e32.Ao_lock()&lt;br /&gt;		self.canvas = None&lt;br /&gt;		self.img = graphics.Image.new((176, 144))&lt;br /&gt;		self.img_tmp = graphics.Image.new((42, 36))&lt;br /&gt;		self.x, self.y = 0, 0&lt;br /&gt;		self.p = 0&lt;br /&gt;		self.pages = 0&lt;br /&gt;		self.currpages = 0&lt;br /&gt;		self.mpath = 0&lt;br /&gt;&lt;br /&gt;	def OnRun(self):&lt;br /&gt;&lt;br /&gt;		appuifw.app.exit_key_handler = self.lock.signal&lt;br /&gt;	&lt;br /&gt;		self._createList()&lt;br /&gt;		&lt;br /&gt;		self.canvas = appuifw.Canvas(redraw_callback=self.OnUpdate)&lt;br /&gt;		appuifw.app.body = self.canvas&lt;br /&gt;&lt;br /&gt;		self.canvas.bind(key_codes.EKeyRightArrow, lambda: self.move(1, 0))&lt;br /&gt;		self.canvas.bind(key_codes.EKeyLeftArrow, lambda: self.move(-1, 0))&lt;br /&gt;		self.canvas.bind(key_codes.EKeyUpArrow, lambda: self.move(0, -1))&lt;br /&gt;		self.canvas.bind(key_codes.EKeyDownArrow, lambda: self.move(0, 1))&lt;br /&gt;		self.canvas.bind(key_codes.EKeySelect, self.IMG)&lt;br /&gt;&lt;br /&gt;		self._drawIMG()&lt;br /&gt;		&lt;br /&gt;		self.lock.wait()&lt;br /&gt;&lt;br /&gt;	def OnUpdate(self, rect):&lt;br /&gt;&lt;br /&gt;		self.canvas.blit(self.img)&lt;br /&gt;		self.canvas.rectangle([(self.p+(42*self.x), 36*self.y), (self.p+(42*self.x)+42, (36*self.y)+36)], width=2, outline=0x123456)&lt;br /&gt;&lt;br /&gt;	def move(self, x, y):&lt;br /&gt;&lt;br /&gt;		self.x = (self.x+x)%4&lt;br /&gt;		self.y = (self.y+y)&lt;br /&gt;&lt;br /&gt;		if x == 1: self.p = (self.p+2)%8&lt;br /&gt;		if x == -1: self.p = (self.p-2)%8&lt;br /&gt;&lt;br /&gt;		if self.y == 4:&lt;br /&gt;			if self.currpages &lt; self.pages-1:&lt;br /&gt;				self.y = 0&lt;br /&gt;				self.currpages += 1&lt;br /&gt;				self._drawIMG(start=self.currpages)&lt;br /&gt;			else:&lt;br /&gt;				self.y = 3&lt;br /&gt;			&lt;br /&gt;		if self.y == -1:&lt;br /&gt;			if self.currpages &gt; 0:&lt;br /&gt;				self.y = 3&lt;br /&gt;				self.currpages -= 1&lt;br /&gt;				self._drawIMG(start=self.currpages)&lt;br /&gt;			else:&lt;br /&gt;				self.y = 0&lt;br /&gt;	&lt;br /&gt;		self.mpath = (4*self.y + self.x)+(16*self.currpages)&lt;br /&gt;		&lt;br /&gt;		self.OnUpdate(None)&lt;br /&gt;	&lt;br /&gt;	def IMG(self):&lt;br /&gt;&lt;br /&gt;		try:&lt;br /&gt;			m = self.listFile[self.mpath].replace('_PalbTN\\', '')&lt;br /&gt;			appuifw.Content_handler().open(m)&lt;br /&gt;		except:&lt;br /&gt;			pass&lt;br /&gt;		&lt;br /&gt;	def _drawIMG(self, start=0):&lt;br /&gt;&lt;br /&gt;		self.img.clear(0xffffff)&lt;br /&gt;		z = 0&lt;br /&gt;		&lt;br /&gt;		for id in range(start*16, (start+1)*16):&lt;br /&gt;			j, i = divmod(id-(start*16), 4)&lt;br /&gt;			try:&lt;br /&gt;				self.img_tmp.load(self.listFile[id])&lt;br /&gt;				self.img.blit(self.img_tmp, target=(z+(42*i)+(z+1), 36*j))&lt;br /&gt;				z = (z+1)%4&lt;br /&gt;			except:&lt;br /&gt;				break&lt;br /&gt;&lt;br /&gt;		self.OnUpdate(None)&lt;br /&gt;&lt;br /&gt;	def _createList(self):&lt;br /&gt;&lt;br /&gt;		try:&lt;br /&gt;			for id in os.listdir(self.path):&lt;br /&gt;				self.listFile.append(self.path + id)&lt;br /&gt;&lt;br /&gt;			self.ldivx, self.ldivy = divmod(len(self.listFile), 16)&lt;br /&gt;&lt;br /&gt;			self.pages = self.ldivx&lt;br /&gt;			if self.ldivy &lt;&gt; 0: self.pages += 1&lt;br /&gt;		except:&lt;br /&gt;			raise FlickrS60Error('Errore nella creazione della lista.')&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&lt;br /&gt;	FlickrS60Thumb('E:\\Images\\_PalbTN\\').OnRun()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 11 Mar 2006 05:36:17 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1683</guid>
      <author>whitetiger ()</author>
    </item>
    <item>
      <title>Gallery thumbnails</title>
      <link>http://snippets.dzone.com/posts/show/1677</link>
      <description>&lt;code&gt;&lt;br /&gt;from appuifw import *&lt;br /&gt;from graphics import Image&lt;br /&gt;from key_codes import *&lt;br /&gt;#from status import *&lt;br /&gt;#from e32db import format_time&lt;br /&gt;import os, e32&lt;br /&gt;&lt;br /&gt;dir = u'C:\\Nokia\\Images\\_PAlbTN\\'&lt;br /&gt;os.chdir(dir)&lt;br /&gt;fs = os.listdir('')&lt;br /&gt;mtime = os.path.getmtime&lt;br /&gt;# newest first&lt;br /&gt;fs.sort(lambda a,b: cmp(mtime(b), mtime(a)))&lt;br /&gt;&lt;br /&gt;app.body = canvas = Canvas()&lt;br /&gt;# show just 16 images&lt;br /&gt;for k in range(min(16, len(fs))):&lt;br /&gt;    j, i = divmod(k, 4)&lt;br /&gt;    im = Image.open(dir + fs[k])&lt;br /&gt;    canvas.blit(im, target=(2+44*i, 2+34*j))&lt;br /&gt;canvas.rectangle([(0,0), (43,33)], 0xff, width=2)  # selected&lt;br /&gt;&lt;br /&gt;x, y, k = 0, 0, 0&lt;br /&gt;def move(dx, dy):&lt;br /&gt;    global x, y, k&lt;br /&gt;    canvas.rectangle([(44*x,34*y), (44*x+43,34*y+33)], 0xffffff, width=2)  &lt;br /&gt;    k = 4*y + x + 4*dy + dx&lt;br /&gt;    y, x = divmod(k, 4)&lt;br /&gt;    canvas.rectangle([(44*x,34*y), (44*x+43,34*y+33)], 0xff, width=2)&lt;br /&gt;    if 0 &lt;= k &lt; len(fs):&lt;br /&gt;        app.title = u''+fs[k]&lt;br /&gt;        #status_on(format_time(mtime(fs[k])))&lt;br /&gt;&lt;br /&gt;# move cursor and open image&lt;br /&gt;canvas.bind(EKeyUpArrow,   lambda: move(0,-1))&lt;br /&gt;canvas.bind(EKeyDownArrow, lambda: move(0,1))&lt;br /&gt;canvas.bind(EKeyLeftArrow, lambda: move(-1,0))&lt;br /&gt;canvas.bind(EKeyRightArrow,lambda: move(1,0))&lt;br /&gt;canvas.bind(EKeySelect,    lambda: Content_handler().open(dir[:-8]+fs[k]))&lt;br /&gt;&lt;br /&gt;# standard code for non-loop app&lt;br /&gt;lock = e32.Ao_lock()&lt;br /&gt;app.exit_key_handler = lock.signal&lt;br /&gt;lock.wait()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;</description>
      <pubDate>Fri, 10 Mar 2006 08:03:21 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1677</guid>
      <author>korakot (Korakot Chaovavanich)</author>
    </item>
    <item>
      <title>[Multiplatform] Thumbnails of all (gif, jpeg, and png) images in a directory</title>
      <link>http://snippets.dzone.com/posts/show/1297</link>
      <description>Thanks Dorrin for your Thumbnailer!&lt;br /&gt;I hope you don't mind, but I did some minor fixes and made your script more portable. Now, you can use it on Windows too.&lt;br /&gt;By the way, as I revealed there is no dependency of "from mod_python import apache", so I removed it.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import os&lt;br /&gt;import re&lt;br /&gt;from PIL import Image&lt;br /&gt;&lt;br /&gt;header = '''&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;&lt;br /&gt;&lt;html&gt;&lt;br /&gt;&lt;head&gt;&lt;title&gt;Directory Listing&lt;/title&gt;&lt;/head&gt;&lt;br /&gt;&lt;body&gt;'''&lt;br /&gt;images_per_row = 5&lt;br /&gt;max_width,max_height = 150,150&lt;br /&gt;&lt;br /&gt;path = os.path.dirname(__file__)&lt;br /&gt;  &lt;br /&gt;def thumbnail(filename):&lt;br /&gt;  thumbsdir = os.path.join(path, ".thumbnails")&lt;br /&gt;  thumbfile = os.path.join(thumbsdir, filename)&lt;br /&gt;  if os.path.exists(thumbfile):&lt;br /&gt;    return&lt;br /&gt;&lt;br /&gt;  if not os.path.exists(thumbsdir):&lt;br /&gt;    os.mkdir(thumbsdir);&lt;br /&gt;    &lt;br /&gt;  filepath = os.path.join(path, filename)&lt;br /&gt;  image = Image.open(filepath)&lt;br /&gt;  image.thumbnail((max_width, max_height), Image.ANTIALIAS)&lt;br /&gt;  image.save(thumbfile)&lt;br /&gt;&lt;br /&gt;def index(req):&lt;br /&gt;  return_value = header&lt;br /&gt;&lt;br /&gt;  dir_list = os.listdir(path)&lt;br /&gt;  image_list = []&lt;br /&gt;&lt;br /&gt;  search = re.compile("(.*\.[Jj][Pp][Ee]?[Gg]$)|(.*\.[Pp][Nn][Gg]$)|(.*\.[Gg][Ii][Ff]$)")&lt;br /&gt;&lt;br /&gt;  image_count = 0&lt;br /&gt;  for file in dir_list:&lt;br /&gt;    if search.match(file):&lt;br /&gt;      image_count += 1&lt;br /&gt;      image_list.append(file)&lt;br /&gt;&lt;br /&gt;  if image_count &gt; 0:&lt;br /&gt;    image_list.sort()&lt;br /&gt;    num_rows = image_count / images_per_row&lt;br /&gt;&lt;br /&gt;    image_num = 0&lt;br /&gt;    return_value += '&lt;table width="100%" border="0"&gt;&lt;tr&gt;\n'&lt;br /&gt;&lt;br /&gt;    for image in image_list:&lt;br /&gt;      thumbnail(image)&lt;br /&gt;      image_num += 1&lt;br /&gt;      return_value += '&lt;td&gt;&lt;a href="' + image + '"&gt;&lt;img src=".thumbnails/' + image + '" alt="' + image + '"&gt;&lt;/a&gt;'&lt;br /&gt;&lt;br /&gt;      if image_num % images_per_row:&lt;br /&gt;        return_value += '&lt;/td&gt;\n'&lt;br /&gt;&lt;br /&gt;      else:&lt;br /&gt;        return_value += '&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;\n'&lt;br /&gt;&lt;br /&gt;  return_value += "&lt;/table&gt;&lt;/body&gt;&lt;/html&gt;"&lt;br /&gt;  return return_value&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Here is small test script.&lt;br /&gt;It generates thumbnails with Dorrin's script, then grabs HTML output and writes it to index.html file, so you get nice index page.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import thumbnail&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;html = thumbnail.index(0)&lt;br /&gt;&lt;br /&gt;htmlfile = os.path.join(os.getcwd(), "index.html")&lt;br /&gt;f = open(htmlfile, "w")&lt;br /&gt;f.write(html);&lt;br /&gt;f.close()&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 25 Jan 2006 18:21:02 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/1297</guid>
      <author>mloskot (Mateusz &#197;?oskot)</author>
    </item>
  </channel>
</rss>
