Week One

How are you?

It's been hard to get back into full swing after Christmas. I've just got to remember this is the big one! This week I panicked about how the hell I'm going to simulate taking photographs over the Internet. I finally blew my £75 second year IMD prize book token on various books I thought may save my 'bacon' this year:

Flash Savvy
DSLRs for Dummies

Flash Prototypes

It all began with a tutorial from Frunder.com, a web development company. This show used Flash, Actionscript and Photoshop to create an image blurring effect. Unfortunately the tutorial did not discuss the scripting, so I had to perform my own autopsy on the code.

Version 1.0 - 10 pints simulator

This is essentially the original tutorial file with my own images successfully implemented. Rollover the image to trigger the blur effect. The Actionscript on rollover increases the alpha value of the top image (blurry photo), therefore covering up the clear base image.

Version 2.0 - Focus

Next I started to redevelop the actionscript to do what I want it to do, simulate depth of field. I needed a foreground image to show how Depth of Field affects the clarity of your image subjects. This is the code slightly modified to allow me more control over maximum blur value.

onClipEvent (load) {
dir = 0; sets the direction - increment or decrement alpha
speed = 4; sets the speed of the alpha increments
blurvalue = 100; sets maximum alpha the blur image overlays

topImage._alpha = 0; initializes blurred image alpha to 0
this.onRollOver = function() { on event rollover this button or image
dir = 1; set dir to 1 - increase topimage alpha
this.onRollOut = function() {on event rollover this button or image
dir = -1; set dir to -1 - there decreasing alpha
onClipEvent (enterFrame) {
temp = topImage._alpha+speed*dir; sets temp to current alpha speed dir
topImage._alpha = Math.min(blurvalue, Math.max(temp, 0));
} adjusts topImage according to values

I then created some buttons and assigned code to alter the blurvalue variable for the background and girl. This begins to represent how different Fstops affect the depth of field.

on (release) {
_root.blur.dir = 1; sets movieclip 'blur' dir to 1
_root.blur.blurvalue = 70; sets maximum blurvalue variable to 70
trace("dir"+_root.blur.dir) outputs value in development environment

on (release) {
_root.blurgirl.dir = 1; sets movieclip 'blurgirl' dir to 1
_root.blurgirl.blurvalue = 0; sets blurvalue variable to 0 for 'blurgirl'
trace("dirgirl"+_root.blurgirl.dir)outputs value in development environment
Version 3.0 - Three times the fun

You will now notice 3 layers:

  1. The parasol in foreground
  2. The girl in the middle ground
  3. The beach background

Each layer is blurred to different extents according to the fstop selected by the user. Additionally I created a dynamic text box which displays the current fstop selection.

Layout Prototypes

As I planned to do this week in my Gantt Chart, I began drawing up some screen layouts ideas in Photoshop. These prototypes are based around the desire to be:

  • simple
  • clean
  • crisp
  • functional

I have selected the key colours from the logo to create the nav bar. The content is structured through text size, colour and proximity. Currently the page looks very uncluttered, which is something I want to strive to maintain. However as Gabe suggested last term, I should alot some space for potential sponsored links/advertisers.


This version features improved alignment of the content. The title has been aligned with the same underlying grid. However rules are made to be broken and I honestly prefer the initial centered logo in terms of alignment, scale and consequent impact.

Week Two

Interactively Inspired

Canon eos site

Canon 400D interactive. This site features some nicely assembled Flash and Video. The result is an interactive parts diagram, for all sides of the Canon digital SLR. It really inspired me to create something similar this week.

Layout Inspirations

Flash Portfolio

Bad Assembly. This site has made me reconsider about whether to use mainly CSS or purely Flash. My interactive elements will be created in Flash, so perhaps a completely flash based site may be viable.

I love the fluent feel of Flash based sites such as Bad Assembly. The transitions between pages are seemless.

Week Three

I am the mighty Portfolio!

This week was dedicated to the design and building of this portfolio.

Some notable features are:

  1. SIFR - Headings are replaced with Flash renders.
  2. PNG - Transparency used for images and rollovers.
  3. Javascript forced transparency for IE 6

Will resume next week.


Week Four

Flash ah ah he saved everyone of us!

Who would have thought simulating a camera would be so hard...

Slider Implementation

This version reveals some significant development:

  1. Some fairly complex slider Actionscript that links up to the control of my image blur mechanism
  2. Improved Fstop Meter, based around the information screen on Digital SLRs.
  3. Improved aesthetics, though by no means fully developed.

Next week I shall start creating other interactive flash elements such as parts of DSLR.

Coppermines, AJAX and confusion

In the background I've also been testing out some gallery systems, which was a consideration in my MPP.

  1. Coppermine
  2. Ajax Nappa Yang

So far Coppermine has been the easiest to work with. I set up my own structure and customised the display of PHP includes easily enough. I may attempt to create my own theme next week.

Week Five

Back to Flash

50+ Photos

This week I started to mock up the interactive guide to the parts of the DSLR. Inspired by Canon , I started shooting photos of my camera set up on the tripod, with my home studio effort. The result was 50+ photos, which then had to be carefully cut out in Photoshop to create each frame. These were then imported to flash and implemented into 25 various movie clips to cater for each possible navigational route.

The current version shows 3 of the five views in operation. Next I hope to improve the appearance and consider how I will allow the user to rollover and find out more on each part.

Version 1.0

The current version shows 3 of the five views in operation. Next I hope to improve the appearance and consider how I will allow the user to rollover and find out more on each part.

HDR Photography
Rainbow HDR

Flickr full size image. I finally got stuck into some HDR, the result is some seriously vibrant and impactful imagery.

This photo was taken beside Shane's Castle in Antrim.

Week Six

It's all go


This week has been largely dominated by the COM601 RSS Assignment. On the upside it gave me some Actionscript practice, as I managed to simulate an Ipod Wheel for navigation. View RSS

Choose a Technology

This week I also went crazy thinking of ways I could create Pictorio.us. Here are my thoughts:

  1. I know I could build something easily enough
  2. Not really doing anything new, or interactive or special
  3. It works, the most cross compatible option
  1. I have a solid knowledge in designing and actionscripting
  2. Complete hassle to add to and update
AJAX - Backbase
  1. I have some experience in it - COM601 Ajax Bank
  2. Complete hassle to add to and update
  1. I have no experience in it, though it's allegedly 'easy' with fast application build time
  2. Allows for 'mash ups' of various technologies including PHP, Ajax and RSS

To be honest I don't really want to make a one off Flash site, I want to make something alive, that stays fresh and 'sticky'.

Week Seven

Oooh it's so flexy!

Flex 2

I have dived right into the world of Flex 2. It's a powerful program, rather daunting at first, but just one week in I'm lovin' it.

Week Eight

Presentation Trepidation


This was my week in the firing, to present my Major Project - Pictorio.us. I spent an immense amount of time into preparing my presentation, creating graphics, and coming up with witty alliterations, metaphors and such!

I went around about half a dozen printers looking to get some cards done, however the small run just didn't work out economically viable. So I printed 100 cards myself, borrowed a decent guillotine and got to it.

I practiced the presentation to my parents, my brother and my girlfriend (with me half naked to make the real thing easy!). All in I ended up practicing it about 10 times. On the day it went well for me, I even maintained the balls to flash my absurd Pictorio.us tattoos!

Download PowerPoint Pictorious Presentation (Like that alliteration eh?!)

One of the lovely cards I gave out

Week Nine

Lights, Digital Camera, Actionscript!

This week has been devoured by hardcore Flash programming. I've created the guts of an interactive parts diagram based on my camera, but is also very informative to other DSLR users too. This is the product to date:

I'm feeling pretty pleased with it so far! Things I want to change are:

  • Tidy up the transitions a bit.
  • Reduce file size.

What the hell am I doing?!

Now that my Gantt chart is shot to sh*t as Flex 2 completely redefines my project I have decided to start actually using my Basecamp account. I've set up various to do lists and a couple of milestones to aim for.

Looks like I'll be a busy boy...

Week Ten

Interactive Shutter Speed

I've created the basics of my shutter speed explanation. I've tried to really simulate the camera so people learn where the parts are and can apply the tutorial to real life.

The example photos were shot at the waterfall in Glenoe. I shot a range of photos at various shutter speed to show how movement can be controlled using different speeds. I then shot a video loop of the same composition to create the looped viewfinder footage. For the final touch I recorded the actual sound of the various shutter speeds by miking up my camera via my recording set up. After getting the sequence of sounds I cleaned them up with some noise reduction and dynamics processing.

Easter Entry 1

What a pile of CRUD

With all this talk of communities I thought I'd have a look into Flex2 and dynamic data from a database. Adobe kept pushing Coldfusion as the technology to work with. So I got Coldfusion server up and running locally then began trying out some Flex/Coldfusion tutorials from Adobe.

After the usual 'Hello World' excitement I jumped right into building a Create Read Update Delete (CRUD) running off a Database on my local server.


So here we have a lovely CRUD built using the stock Flex 2 components, probably one of the best web CRUDs I've ever used.

Flex 2

I'm really excited about all this, but I am questioning if I have the time to make this happen.

Easter Entry 2

To Login or not to Login?

I couldn't help but try a few tutorials on Login Systems for Flex.


This Screenshot shows the a Functional Login form powered by Coldfusion and MySQL, with a Flex 2 frontend. The result it a rather nice User Interface, with tooltips and validation before you submit, so Web 2.0...

Flex 2

Logged in

Then once I log in I am personally greeted depending on my Name in the database. Fantastic.

Flex 2


I also managed to get a register form to work, complete with validation that Flex 2 does so well.

Flex 2

I wish I could share my lovely CRUD and Login system with you but that brings me into a huge problem...

Coldfusion + Deployment = Bankruptcy

Sadly I didn't realise just how much Coldfusion servers cost. Although I did consider setting up my own locally, but realized I just don't have the time, especially with all the personal circumstances that have taken away about 6 weeks of my development time.

L33t Uploader

In the middle of all my database driven excitement I even got a uploading tool to function with a little help from the Coding Cowboys It allowed multiple file uploads with fancy progress bars that make Flickr look like 'my first website'.

Flex 2

This was cool but to be quite honest, getting this uploader to talk to my CRUD just wasn't happening anytime soon.

Let go...

Alas I had to give up the dream of my very own community build in Flex 2... for now. However I learnt alot doing these very challenging prototypes, which will be of benefit for the rest of my project, and in the future. Pictorio.us was designed to teach, not to be Flickr 2.0


Now lets get on with it :)

Week 11

Flex 2 and Actionscript 2

I added my shutter speed tutorial to my Flex application, thinking everything would work fine. My recent streak of fantastic luck continued I found that the tutorial did not work correctly at all. It continually looped through the frames without stopping.

I figured it must be an Actionscript issue, Flex 2 is Actionscript 3, I had coded in Actionscript 2. That left me with only one option.

Learning Actionscript 3

Just to add to the challenge I was forced into a crash course of Actionscript 3. Within a day or two I had rewritten all my code for the shutter speed tutorial. I also added some nifty tooltips to clarify what my tutorial was about.

I'm feeling pretty happy now that I've got that working again, better than ever. The tooltips add that extra bit of learning, without cluttering the page with text.

Principles - ISO

ISO measures your cameras sensitivity to light, so the higher the ISO the more sensitive, the faster the shutter speed but the more noise in your photo.

The obvious illustration of ISO noise was to show 3 photos but I wanted something more than that. So I took 3 photos and thought what I could do to make it clearer. I was going to just photoshop the hell out of them to bring out the noise, then in Flash I remembered the Filters.

The result sure beats the usual couple of photos, I always feel you learn more when you interact. This technique means the user will interact, but not just for the sake of interaction.

Principles - Rule of Thirds

The Rule of Thirds is probably the most basic yet important compositional technique for the learning photographer. It sets you free from that mentality of centering every subject you photograph and can really improve your standard.

To illustrate a simple principle I used a simple interactive photo, when you rollover, the underlying grid is revealed. Naturally I couldn't just have a on/off rollover, I wanted it to look good! So I used the filters to dynamically blur the grid in and out.

A simple yet pleasant piece of interactive flash, coded in AS3 of course ;)

Lenses - Wide Angle

I thought it would be nice to show a little more than just a lens and a description. So I found parts diagrams of 3 popular lenses and created some more rollover goodness.

Another simple yet pleasant piece of interactive flash, that has an educational purpose without frying the readers brains with technical terms they don't need to know.

Back to Flex

I added my lenses to my Flex app, and it looked quite good, but quite good wasn't enough. I realised if I showed example photos taken with these types of lenses, of the exact same subject it would better convey their use. The problem was I was running out of screen real estate, so I thought about a tab box, with the tabs 'lens' and 'photo'. This worked fine, didn't look that great though. Then I found Alex Uhlmann's Distortion effects

It basically consisted of a AS 3 component and some flex components to hold the pieces together. I installed the components and began recoding it to work for my needs.

Cubic Lens Madness

I love these cubes! They're not just a naff effect, they actually make for great UI.

Photo Time

So I went up to Knockagh Monument and shot photos of the view with various lenses of the same subject...

Cubic Lens Madness
Cubic Lens Madness
Cubic Lens Madness

These were all shot within 20 seconds, same view, different lenses. Showing wide(18mm), standard(35mm) and telephoto(100mm). Quite a difference considering the rather narrow range available to me.

Week 12

Scale-9 Style!

Ok so Flex looks cool with just some CSS styling to change your panel/button/component features, but I wanted more! The best method I found was using Scale-9 skins build with Flash. Scale-9 basically divides your panel or whatever into 9 pieces. It then only stretches the middle sections, keeping those neat rounded corners round, not oblong. It really blows away your regular lossy techniques, with lossless scalable vectors.

Scale 9 rocks!

Make no mistake this was completed over days.

New Skin

How Web 2.0 eh? Well it is very trendy, but I haven't made it too obnoxiously trendy. I love the glows, which were admittedly inspired by, dare I say it, Windows Vista!

Scale-9 CSS

Now I had made my skin I had to tell Flex how to use it, this is done entirely with CSS.

Button { disabledSkin: Embed(source="flex_skins.swf", symbol="Button_disabledSkin"); downSkin: Embed(source="flex_skins.swf", symbol="Button_downSkin"); overSkin: Embed(source="flex_skins.swf", symbol="Button_overSkin"); upSkin: Embed(source="flex_skins.swf", symbol="Button_upSkin"); fontFamily: Trebuc; rollOverColor: #0099ff; selectionColor: #0099ff; color: #ffffff; textRollOverColor: #0099ff; textSelectedColor: #0099ff; }

This code caters for each of the skins, whilst Flex automatically understands the scale 9 swfs. Each component was defined as a symbol, so the entire skin could be saved as one swf yet each component could be referred to. The entire skin is 23kb! In your face html/jpg/gif!


I wanted to start adding some technique tutorials, these were to explain photographic techniques you can learn to improve your skillset. This section will grow in time, as I intend to keep Pictorio.us alive beyond its purpose as a Major Project.

Techniques - Panning

I thought what would be the best way to illustrate panning? One of the most popular uses of panning in the industry is for car advertisements and motorsport photography. So I convinced my brother and his greeny blue Mazda (the Lizard) to come down to Hazlebank for some moderately high speed passes. Panning is damn hard! Finally I got a few pics I was happy with.

Panning the Lizard

After a minimal amount of Photoshopping it looked great, but to fully convey panning I needed more than a photo. So I shot a short video to show how I actually took the photo. This in addition to a basic animation conveyed the technique far better than words.

Simple but effective...well I thought so anyway!

The Gallery

I had several tutorials on Flickr integration with Flex built, so I finally decided to get around to making them into what I wanted:

  1. Access photos tagged with Pictorious
  2. Photos tagged with words from my combo box
  3. Search all photos within the current combo box selection
  4. Search all photos by tags
  5. Search all photos tagged with pictorious and user defined tags
  6. Display a list of results with thumbnails
  7. Show the photographers name and photo title
  8. Click on the photo to view it full size
  9. Be able to zoom in and out
  10. Be able to link to the photo on Flickr for commenting etc.

With the various pieces of sample code I quickly had the guts of the viewing gallery built. I've played with lots of Flickr mashups for Flex. The best one I found was on a Cynergy Systems Blog. This would form the basis of my gallery.

So I recoded it to work with Pictorio.us, as their code set the gallery as the application where as I only wanted it as a page. So I needed to recode it so it would work as a subpage. After alot of trial and error it finally worked as a separate component. Next I started customising the aesthetics and UI:

  • Used my custom skins
  • Removed surplus information such as co-ordinates etc.
  • Added dynamic titles to the zoom panel
  • Added a button to link to the photographers picture - dynamically set url
  • Added dynamic tooltip to the button
  • Customised icons for zooming in/out and reset
  • Added tooltips to all buttons

Next I realised a huge flaw, the browser caches the RSS feed that determines what photos appear. This meant that the user would have to clear their cache to see the latest pics, and we can't have that can we?

After a cacophony of swearing and some forum help I found the answer was simple:

  1. Create variable
  2. Assign a random number to it
  3. Add it on to the request URL
private function requestData() : void
loadingData = true;
var tags : String = searchString.text;
var regExp : RegExp = / /;

while ( tags.search( regExp ) >= 0 )
tags = tags.replace( regExp, "," );

httpService.url =
baseURL + (tagmode.selected ? 'pictorious,' : '') + selectedItem.data + ","
+ tags +"&tagmode=" + (tagmode.selected ? 'all' : 'all')+ "&num="+ randomNum;

This takes the user's text entered in the searchString.text box, searches for any spaces and replaces them with commas. The url for the request is quite complex:

  1. baseURL (http://api.flickr.com/services/feeds/photos_public.gne?format=rss_200&tags=)
  2. tagmode.selected (if checkbox is ticked include tag pictorio.us so only pictorious pics come back)
  3. selectedItem.data (contains the combo box selection)
  4. tags (the string of text the user entered after having it's spaces stripped)
  5. "&num="+randomNum (Gets around caching problem by adding a meaningless extension to each URL)

The caching problem was unexpected, but thankfully I quickly came up with that work around.

The next major problem was the fact that the Flickr RSS has EVERY <author> preceded with "nobody@flickr.com". Very useful guys. So I needed to strip out this crap from the data - <author>nobody@flickr.com (Marcoolio)</author>

This took some thought, but I already had a function to remove the "media:" from tag names, so I adapted this to remove my current problem:

private function onResult( event : ResultEvent ) : void
var pattern : RegExp = /media:/;
var pattern2 : RegExp = /nobody@flickr.com/;
var pinput : String = event.result as String;

while( pinput.search( pattern ) >= 0 )
pinput = pinput.replace( pattern, "_" );
var finaloutput : String = pinput;

while( finaloutput.search( pattern2 ) >= 0 )
finaloutput = finaloutput.replace( pattern2, "" );

var data : XMLList = (new XML( finaloutput )).channel.item;
list.dataProvider = data;
loadingData = false; }

The result was the name displayed in brackets without the NOBODY@Flickr.com nonsense.

In order to search by my tutorial types I needed a combo box:

public var tags: Array = [
{label:"All", data:""},
{label:"HDR", data:"hdr"},
{label:"Macro", data:"macro"},
{label:"Multiple Exposures", data:"multiple, exposure"},
{label:"Panning", data:"panning"},
{label:"Slow Shutter", data:"slow, shutter"},
{label:"Slow Sync", data:"slow, sync"},
{label:"Zoom Burst", data:"zoom, burst"},

public var selectedItem:Object;

Pretty simple stuff, just create the combo box assign the array and set up this in the script:

  1. Create array with labels and data(contains tag name)
  2. Create a variable to store whatever item is selected in the combo box

One last thing I wanted was to have the option of searching all of Flickr, for that I used the checkbox which just alternates the tag requirement between 'Pictorious' and '' which means no tag - so pictorious isn't a required tag.

Finally for the front page I just set up a minimalist version of this, with the source set to the Flickr group Pictorious.

Extra Time

Time Management

As much as I would love to say I've been using my Basecamp religiously I haven't. Instead I've been using two techniques, a Word file with day by day task list and the in built Flex task manager.

flex task manager

The Flex task manager is fantastic! Not only does it keep track with priorities, but when I decide to do it I just click on the task from the task list and it brings me straight to the line of code where I created the task!

oh no he didn't! oh yes he did!

I know, I know! It's not the done thing, but it works for me! That's what counts right?


All those HTML folk have it easy when it comes to something like an email form. Unfortunately with Flex I needed to use some sort of server side script to handle email. I went on the hunt for email forms for Flex and struck oil with this basic email form tutorial. It use PHP to handle Flex's Remote Procedure Call.

$senderName = $_POST['senderName']; $senderEmail = $_POST['senderEmail']; $sendToName = $_POST['sendToName']; $sendToEmail = $_POST['sendToEmail']; $emailMessage = $_POST['emailMessage']; $recipient = "$sendToEmail"; $subject = "$sendToName"; $headers = "$senderEmail "; $message = "From: $senderName\nEmail Address: $senderEmail\nTo: $sendToName\nEmail Address: $sendToEmail\n\nMessage: $emailMessage"; $message = StripSlashes($message); mail($recipient, $subject, $message, $headers)

Meanwhile the Flex AS3 looks like this:

public function sendEmail( ):void { var senderName:String = senderName.text; var senderEmail:String = senderEmail.text; var sendToName:String = selectedItem.data; var sendToEmail:String = "pictorious@marcharrington.com"; var emailMessage:String = emailMessage.text; this.emailService.send({senderName: senderName, senderEmail:senderEmail, sendToName: sendToName, sendToEmail: sendToEmail, emailMessage: emailMessage}); }

Just to be better than standard PHP I of course included validation with as you type feedback (HCI nirvana), also with the submit button disabled until all fields meet my validation rules, beat that AJAX :P

New Skin

All the email goes to my pictorious mailbox, complete with all the form details.

Announce List

I thought it would be nice to have an announce list, so I could inform subscribers of the latest Pictorio.us news. Unfortunately getting my Flex App to talk to the announce list.cgi was going to be a huge task, that no-one has previously done in Flex. I tried various techniques but alas it was devouring my time and going nowhere. So I settled for an external HTML page, but I did try to make it look just like my Flex app!

Announce List
Announce List

Not a bad solution for a problem I really don't have time to waste on.

cURLy Wurly

Thanks to the joys of Flash 9 and its high security sandbox antics, I am denied of accessing the RSS feeds from photography sites which lack the crossdomain.xml file(which is all of them). So the solution was to save a local copy of the feed every time the user accesses Pictorio.us

So the solution is cURL, being as the proxy server technique has been denied of me courtesy of Dreamhost. Nick got me off to a great start with this one by interpreting my pseudo code into the basic of my cURL.php file. Unfortunately it didn't work, but after some php forum help and alot of reading up I found this to be the final solution:

// create a new curl resource
$ch = curl_init(); // set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, "http://www.dcviews.com/dcviews.xml"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// grab URL, and return output
$output = curl_exec($ch);
// this is the magic bit
$fp = fopen("dcviews.xml", "w");
// close curl resource, and free up system resources

And to my great amazement it worked! The next step was getting Flex to interpret the RSS feed, now saved locally in my server. This is the HTTPService which gets me my server side copy of the feed, and gives it the id "dcRequest".


Next I set up a datagrid which will contain my news feed items. Within that datagrid I create an item renderer which allows me to set up the layout of each rss feed item. I can then set what data should be output from the feed and set up links to view the full story on click. The code is really quite simple as Flex is great with XML.

variableRowHeight="true" dragEnabled="false"
verticalGridLineColor="#000000" verticalGridLines="false"
cornerRadius="8" y="0" borderStyle="none">

<!-- Inline item renderer: Image control -->

<mx:DataGridColumn wordWrap="true" headerText = "News From DC Views.com">
<mx:VBox buttonMode="true" paddingLeft="10" paddingRight="15" paddingTop="10" width="80%" height="170" horizontalAlign="left" verticalAlign="top" click="openURL(data.guid)">
public function openURL( url : String ) : void
navigateToURL( new URLRequest( url ) , '_blank' );


<mx:VBox width="100%" height="36" horizontalAlign="left" verticalAlign="top">
<mx:Label fontWeight="bold" text="{data.title}" height="15" buttonMode="true" />
<mx:Label text="{data.pubDate}" fontSize="10" height="15" buttonMode="true" />
<mx:TextArea text="{data.description}" width="100%" height="100%" selectable="false" borderStyle="none" buttonMode="true" wordWrap="true" />

A nice datagrid

A rather nice datagrid, streamed from the DCviews.com newsfeed.

DOF Revamp

As this project has progressed my Depth of Field simulator had grown out of style. So it was time to revisit it and make it fit better into my new style.

I used my new and improved Screen from the shutter speed simulator, recoded some of the actionscript for more responsiveness and tidied up the aesthetics a bit


As I realised I would be creating many more technique tutorials I realised I could do with a ratings system to depict how difficult each technique is. This wasn't a major task, I decided to use my iris/circle as a star out of five system. Upon rollover further explanation is given via tooltips.

Rated 4

The ratings in action, informative without being overly obvious and annoying.


In addition to the ratings I felt an equipment list was needed. I began developing my own icon set to represent common equipment required. These represent:

  1. A tripod
  2. Photomatix
  3. Photoshop
  4. Zoom Lens

I wanted to avoid cluttering every page with these icons and their explanation so I decided to use a popup window, but don't worry! Flex popups aren't annoying like their html counterparts.

So I created a spanner to represent the word equipment, each technique has a spanner in the same place, which opens the pop up about the equipment for that technique.

A nice Popup

Check out that sexy background blur! How could you not love that?

Techniques - HDR

I wanted to explain HDR step by step. I thought hard about the best way to do it, many web tutorials are several thousand words long, I wanted to avoid this. HDR really isn't that hard, so I wanted people not to be scared off like I was. I decided to use my cube effect as show in the lenses section. There was a problem though, they only catered for 2 sides, I had 4 steps in mind. With four steps I needed to keep track of what step I was on and if there was another step left. So I started working out the necessary AS3 code:

public function rotate(direction:String, numberOfSides:Number)
var newSelectedIndex:Number = (cubeViewStack.selectedIndex + numberOfSides) % 4;
if (newSelectedIndex == -1) newSelectedIndex = 3;
var hideEffect:CubeRotate = new CubeRotate(cubeViewStack.getChildAt(cubeViewStack.selectedIndex));
if (numberOfSides == 2)
hideEffect.siblings = [cubeViewStack.getChildAt((cubeViewStack.selectedIndex+1) % 4),cubeViewStack.getChildAt((cubeViewStack.selectedIndex+2) % 4 )];
hideEffect.siblings = [cubeViewStack.getChildAt(newSelectedIndex) ];
hideEffect.direction = direction;
hideEffect.duration = 1000;
cubeViewStack.selectedChild.setStyle('hideEffect', hideEffect);
cubeViewStack.selectedIndex = newSelectedIndex;

I based the code on a suggested section of concept code on Adobe's Alex Uhlmann's Blog.

The Flex 2 MXML code looked like this:

<mx:ViewStack id="cubeViewStack" width="600" height="450">
<sides:HDR1 label="View 1" title="1.HDR Vs Regular" width="100%" height="100%"/>
<sides:HDR2 label="View 2" title="2.How Do I Shoot Them?" width="100%" height="100%"/>
<sides:HDR3 label="View 3" title="3.How Do I Combine Them?" width="100%" height="100%"/>
<sides:HDR4 label="View 4" title="4.The Result" width="100%" height="100%"/>

<mx:HBox width="100%" horizontalAlign="center">
<mx:Button label="&lt;&lt;Previous Step" click="rotate('RIGHT', -1)"/>
<mx:Button label="Next Step&gt;&gt;" click="rotate('LEFT', 1)"/>

This sets up the ViewStack which refers to my various sides using the "sides:" namespace prefix, then the Hbox contains my previous and next buttons to rotate the stack.

Mid rotate

The result is a nice and easy rotating cube UI, which prevents the user from being scared away by vast amounts of boring text.

But how does it work?

I couldn't help but think my project was missing one thing, "how it works". I thought about long winded explanations into equations and mathematical explanations into lens power, sensor types and all that but then thought no. My Pictorions don't need to know that. Pictorious has been about keeping things simple, but maximizing learning. So I started sketching parts diagrams and after some evolution this was the product:

Fantastic, a straight forward diagram, with interactive rollovers, that show how things change and explains via tooltips why. A simple solution to the problem, all coded in AS3, which I'm actually starting to like now :)

User Testing

Family and Friends

Throughout this entire development process I have been constantly seeking the feedback of others like:

  • Tim Potter
  • Classmates such as Aaron Fitzsimmons
  • My girlfriend (a new to DSLRs photographer)
  • My family, including my exceptionally critical Computer Science graduate brother Paul

This has helped iron out many problems that I may have missed, being as I the creator know exactly how it all works. However I start to wrap up Pictorio.us I feel I should let a little bit of the outside world in...


I've had a lot of survey participants back in last semester from the creative forums at hexus.net. The hexus participants were also excellent at providing specific feedback during that survey so I thought they'd be an excellent test group.

So I posted on forum:

Well I've got a fair bit of my interactive guide to Digital SLR Photography created, Pictorio.us. You may remember my survey from late last year, finally I have the guts of it built.

SO what I would like you guys to do is take a look and let me know:

  • What you think of the looks?
  • What do you think of the content?
  • What do you think could be added?
  • Or anything else you want to mention

And please keep it constructive and remember this is a work in progress with quite a few gaps!



Within 20 minutes I had feedback already, here is a selection of varied feedback:

"I really like the design of the site, its really fresh and different from the boring standardness of most other sites. A really good usage of flash, the transitions between tabs is neat. The content looks promising, but I don't know much about photography so I'll stop there! "

It was great to hear some positive feedback from the unbiased outside world, especially from this critical bunch of people!

"I really like the way you've done this. I was sceptical of the Flash site to begin with, but your interface is really effective. "

During my survey I had felt alot of resent towards Flash, but clearly my effective UI had converted some of the biggest Flash haters. (Although mine is technically Flex 2 ;P)

"I thought the initial download was quite large. 957KB? hmmmm I take it you are eventually going to have ads etc on it too? I know it is still in development, but i would be trying get the front page up and loaded as quickly as possible. "

Whilst Pictorio.us is an RIA (Rich Internet Application) at heart I still agreed that the file size could be reduced. After this comment I removed alot of embedded features and began using preloaders within each section.

"Been looking some more. I actually really like the site man, you've done a load of work. I hope you don't mind me throwing ideas at you The camera parts section is cool. It would be smart to have a vertical list of SLRs on the left, clicking on each one bring up the appropriate detail you have for the D80. I know it could grow arms and legs, but in time, it the site was successful it would be a great resource. "

This was fantastic to hear, expansion ideas... Currently my parts diagram only caters for the D80 but expanding to various cameras in future would be excellent, an idea I'd long forgotten. I won't be doing this now, as it is effectively duplication of the same technique but after the hand in, it's something i'll consider.

"you made that? very nice not so sure about the bright pink overlay though... "

I always knew using pink as the dominant colour would be controversial. So I did reduce its dominance throughout the site after several agreements of the pink being too much.

Flickr Group - Photojojo

I came across this group for photoJojo.com which is a group about "The Best Photo Projects, DIY, and Gear". So I posted up about Pictorio.us to see what they thought...

"Wow very nice website you have there. "
"This is brilliant - great work. I'll pass this onto a few friends who've asked for some help in understanding photography and how to take better pictures. "

What better feedback could I ask for? That someone is going to pass it onto friends who need help understanding photography. Looks like I've started to achieve what I set out to do :)

Browser Testing

Throughout the process I've been testing on as many machines as possible. Due to the nature of Flex I am confident that my page will work properly on all browsers. I personally have tested with no apparent issues on:

  • Firefox 1.5
  • Firefox 2.0
  • Opera
  • IE 6
  • IE 7
  • Netscape
  • Safari

My major concern has been Flash Player 9 and how many people have it, but it's becoming ubiquitous with nearly 84% penetration. The other 16% is probably the IMD labs =p

Post Testing Development

Since the initial testing I managed to:

  • Shave off 300k of my file size (almost one third), so the download is now just 644kb, not bad for a "RIA"/Flex app. I achieved this reduction by tidying up various code and removing embedded files that I had coded in my super 'Noob' days.
  • Dramatically reduce the pink overlays throughout the site, with blue now being the dominant colour.
  • Add a help button to explain how to get your photos onto my gallery.
  • Set up a functional/linking news page:
Pictorio.us News

Believe it or not this was actually quite hard to code. This news datagrid runs entirely from my RSS feed, so all I have to do is change one feed and my news is updated. The buttons automatically label themselves with the category and link to that section e.g. "Principles".

Pictorio.us RSS Feed

I also added a link to the raw RSS feed, so people can subscribe with their own aggregator.


It's been a long hard road, with many many unforeseen circumstances that really devastated my hopes and plans. In the end I gave this project 100%, and against all odds achieved as much as I could have realistically hoped for.

With the aid of BaseCamp, my Proposal and constantly writing 'to do' lists I managed to optimise what time had not been devoured by unfortunate events. When I discovered Flex I knew that it was the perfect framework for Pictorio.us I could have stuck to my original html/css/flash plan but I chose to adapt to Flex 2 and don't regret it in the slightest.

I've learnt many things, such as:

  • An entirely new software package (Adobe Flex2) and all that comes with it
  • Actionscript 3
  • MXML (Flex component language)
  • Some PHP and cURL
  • XML/RSS consuming in Flex

The feedback from my users has been absolutely amazing. It's been an excellent boost to my confidence in web design, and a fantastic addition to my portfolio.

Plans for the future

Whilst I've achieved so much, the process has opened up new ideas:

  • Create that fully independent community in Flex, probably with php/amfphp
  • Add more common cameras such as the Canon 400D to the parts diagram
  • Continue adding more techniques like zoom bursts and multiple exposures
  • Add more principles such as white balance

BIG Thanks to...

  • Nick, Chris and Gabe for their continued support and wisdom.
  • Flexy at FlexDeveloper.eu
  • PHPFreaks
  • Tim Potter for his advice and comments.
  • My girlfriend Tara for helping out with photoshoots, feedback and support.
  • My brother Paul for helping out.
  • The nice folk at Hexus.net
  • My family for the support throughout all the hard time.
  • Alex Uhlmann
  • Cynergy System's Blogs for lots of useful Flex components
  • Augie Marcello for some great Flex examples

Now go visit and spread the word :)


News Flash!

Thanks DigicamReview.com

Those lovely folk at DigicamReview.com put Pictorio.us on their front page and links section! Great to hear it's getting around.

Google Analytics
Hit me up!

You can see my user testing phase, followed by a dip, followed by a huge ascent on the first day of release.

Hit me up!

It's great to see so many direct hits, from this I can tell that word of mouth is paying a major part in spreading the news. This in turn means that people must actually be recommending it to their friends, just like they said in their user testing/feedback posts. Couldn't ask for a better response...

Thanks for reading,
Marc Harrington

Breaking News -Exponential!

970 hits yesterday or 887 unique visitors! That's mainly thanks to imagine-resource.com who gave Pictorio.us a fantastic write up, thanks guys!

"New website demystifies DSLR photography
By Michael R. Tomkins, The Imaging Resource
(Thursday, May 31, 2007 - 14:55 EDT) University student Marc Harrington dropped us an email this week with news of an interesting new site he created as a university project. Marc describes Pictorio.us, currently launched in alpha form, as "an interactive guide to Digital SLR photography". The site offers quite a range of information in a very approachable format. You'll find details on such topics as ISO sensitivities, shutter speeds, depth of field and more - as well as advanced topics such as high dynamic range photography. There's also a neat section describing the parts of a typical digital SLR, and how it works as a whole. A gallery section lets you browse through example images on Flickr - either restricting them to just those from Pictorio.us or from all Flickr users.

All in all, a pretty useful site for anybody who wants a fun way to learn a little more about their digital SLR. Our congratulations to Marc on the launch!"
Hit me up!
Take me to the Top