Just finished another cup of coffee…and this week’s build! This release contains mostly bug fixes but it also includes all of the plumbing for the image filtering API. This feature will allow for some much smarter people than myself to implement kick-ass image filters for PhotoMonkee. Filter developers will be able to sell or give-away their creations. Once PhotoMonkee reaches a larger audience we’ll cook up a plugin store to help get the word out and generate sales.
I’ve been asked by a few people “Why do you require OpenCL? Photoshop doesn’t need it and they sell a hojillion copies!”. My response is twofold:
1) I want to push the envelope and incorporate the latest technologies.
2) I don’t need to sell a hojillion copies…just enough to pay the mortgage!
Before continuing, here’s a quick video of the color substitution filter in action (pop the player out to 1080p for the best viewing).
The concept of image filtering is simple: given a source image, apply some type of algorithm to the image which yields a modified version. The filter can be as simple as inverting the colors or something a little more taxing such as a multi-pass convolution filter. Regardless of how simple or complex the filter is, it must be run on every single pixel of the image.
Given a 3000×2000 image (common resolution from a compact digital camera) that means our filter must be run 6 million times to produce the output image.
Some filters have parameters that the user can tweak to vary the intensity of the effect. Using PhotoMonkee’s Color Substitution Filter as an example, the user can spin the color wheel to change the mapping of source and destination hues. Each time the user modifies a parameter we’ve got to reapply the filter to all 6 million of our pixels.
Here’s where things get sticky.
The computer is going to be awfully busy trying to update 6 million pixels when the application asks to redraw the UI because the user moved a slider or clicked a button. Best case? The application spins the filter off to a separate thread so the UI doesn’t hang but you’re still going to end up with a very slow rendering of your image.
What about a preview?
Great idea! Instead of trying to update 6 million pixels we can scale down the image to 256×256 and just update that scaled down preview until the user clicks “accept”. At that point we can give it the full monty. That sucks! I want to see my beautiful 3000×2000 image updated on my 24″ monitor as I tweak the filter. Unfortunately any application that only makes use of the CPU is bound to this slow fate.
How does OpenCL fix this?
OpenCL leverages a concept called heterogeneous computing. In short, it can farm out work to all of your CPU cores and all of the processing units on your graphics card (GPU). In particular, those GPU processing units are really good at crunching image data. An HD resolution image (1920×1080) contains 2,073,600 pixels and is a walk in the park, even on older GPU’s.
OpenCL compatibility issues
OpenCL is still a relatively young API at only 3.5 years old. The initial driver implementations by nVidia and ATI were clunky and are only now getting stable. In addition, Intel is relatively new to the game with their driver offering for CPU-only acceleration. Windows doesn’t yet ship with a driver which, until that happens, means OpenCL isn’t quite mainstream. Think back to the days when OpenGL didn’t come stock with your OS.
Even given the compatibility issues I think that OpenCL is here to stay and is laying a solid foundation for high performance applications in the future. Just this week I started coding up the image filter plugins so 3rd party developers can add filter to PhotoMonkee. Those plugins will all have the ability to leverage OpenCL for accelerated processing.
Interested in getting involved with PhotoMonkee plugin development? Send an email to “email@example.com” =~ s/awesome/com/; and we’ll let you know when the API becomes available. Thanks for your interest!
Last week I tossed down some cash to promote PhotoMonkee via three different online advertisement channels: reddit.com, betabait.com and Google adwords. Here’s how the CPC’s broke down:
Adwords was the clear winner based on price. Of course it’s tough to quantify the quality of those clicks but suffice it to say the spike in site traffic over the last week was well worth the investment. From what I can tell there were 300 downloads of PhotoMonkee over the last week (based on visits to the “try” page….I still need to track the actual clicks of the “download” button).
The only “downside” of the campaign is that there will probably be a drop off in traffic unless people are also following this blog. PhotoMonkee.com isn’t in itself a real content-oriented site that users will come back to. It’s more akin to a brochure to pitch the product. What I need to do next is integrate our youtube channel into the webpage to draw people back on a regular basis. Adding more videos to the channel wouldn’t be a bad idea either
Alright, enough yapping. Time to get back to work and publish build 0.51b – now with more filters!
In this quick tutorial we go over the color palette and other color selection tools in PhotoMonkee. The palette dialog is what manages a user’s custom swatches and allows the creation of custom colors that are used by other tools within PhotoMonkee. The palette supports the RGB, HSL, HSV and CMYK color spaces for whatever mode you are comfortable working in. Oh yeah…and it looks awesome.
Here’s the first video tutorial for PhotoMonkee – resizing and cropping images. I apologize in advance for the craptastic audio quality. I spent some cash and got a quality microphone for the videos after that one.
As someone who works with graphics development I am very familiar with how a computer monitor works. Back in the old CRT days our monitors actually had electron guns in them that were part of producing color on the screen. Each gun was responsible for altering the red, green, and blue phosphors on the screen. Due to that hardware model, graphics API’s tended to revolve around the RGB color model.
The world of printing has been around far longer than computers. Printers have been using various techniques with their presses for a long time to minimize ink usage while maximizing color range. The CMYK color model most closely fits their needs. The CMY elements represent Cyan, Magenta and Yellow. Note: the “K” doesn’t stand for black (I actually thought it did!). It stands for “key” and best describes the process of how the CMY colors are actually keyed off of the black color plate.
When using a graphics editing program, neither of those models works well (for me at least). I don’t want to see individual color components but rather the entire spectrum with varying intensities along that spectrum. Enter the HSL color space. This is what PhotoMonkee uses as the default view in its color palette. Every color (as we typically think of “colors”) is available in the circle. By moving the indicator around the circle you are choosing a particular color. Moving the indicator towards inwards or outwards adjusts the saturation of the color. Simply put, the higher the saturation the more true a color looks; the lower the saturation, the more washed out it looks. Lastly, for each hue and saturation combination we can adjust the lightness for that color. The lightness is how intense the color is represented and ranges from absolute white, to the current color, to black and everything in between. That’s a lot of colors on a simple to use interface!
Be sure to check out our video that goes over how to use the palette dialog in PhtoMonkee and if you have any suggestions on how we can make it better to suit your needs – let us know!
Now that PhotoMonkee is available for people to download and try out it’s time to enter the “promote, fix and enhance” cycle. Having your friends and family try out a product can only get you so far. Last night I submitted PhotoMonkee to some of the large software download sites such as downloads.com, tucows and snapfiles. It’ll be weeks, if not months before people start downloading the app from those sites but when they start it should be a manageable trickle of users – hopefully with some feedback as to how I can improve PhotoMonkee.
In tandem with promotional activities I need to continue to improve the quality and quantity of features in the product. I’ve started actually using PhotoMonkee on a day to day basis. I’ve been making video tutorials as well as editing images for the website and fanpage.
Coding, for me at least, is the easy part. Promotional work is where the gut check occurs and I get to ask: is my application good enough. While doing the submissions to download sites I took a peek at other shareware image editors. Let’s just say I’m pretty happy with where PhotoMonkee is right now. It’s already got a leg up on most of the competition but in the months ahead as it gets refined from user feedback it will get even better.
The next steps in the publicity bandwagon will be to spend some money to place advertisements on Google Adwords and Facebook. I’m holding off a little bit to see how much organic traffic I can drive to the homepage first.
Call it a “soft launch” but it’s a launch nonetheless. The website is now live, along with the store. An announcement was made on our Facebook fanpage as well as to my friends and family (feel free to spread the word if you’re reading this).
We’re selling an alpha version (build 0.12a) of PhotoMonkee for eight bucks (buyers are getting all of 1.x for $8) with the hopes of drawing in a few folks to give some solid feedback and help flesh out the last major bugs.
So, the easy part is done: writing tons of code and getting stuff to work on my development machine and our family computers. Now comes the hard part – fixing bugs and adding support for everyone else’s configurations!
It’s crazy to imagine that just about seven months ago I started learning a new GUI framework just out of boredom from my day job. It’s funny what you can do with a little time, effort and boatloads of support from your family.
Back on Labor Day of last year my goal was to have something people would actually fork out their hard earn cash for, by March 1st of this year. While I wouldn’t call PhotoMonkee “rock solid” in terms of stability it’s definitely head and shoulders above some of the other photo/painting apps that are out there. That’s why, next week, I’m going to open up the store and start selling an alpha version for a whopping eight bucks.
Honestly, it just had a nice ring to it: The “eight buck alpha”. Why not make it free? Simple, for $8 you’re actually getting a years worth of updates, including the eventual 1.0 release. Selling some initial copies will also help fund additional hardware purchases (i.e. a Mac so I can port PM over to that) and some other software licenses I’d like to pick up. The initial budget for PhotoMonkee was $1,000. I’d like to make some of that back first before shelling more cash out.
What’s in the Alpha?
Most of the base feature set that I had envisioned is already in place for the 1.0 release. All your basic image manipulation, plus a small truck load of advanced features are already in place. The reason I’m calling it an alpha instead of a beta is two fold:
People are going to run PM on hardware combos I haven’t tested – it will probably break.
I’m open to adding new features to the 1.0 release if enough folks suggest it. So while it’s currently feature complete – something might pop up I didn’t think of.
When is Beta?
Once I feel comfortable that enough people have used PhotoMoknee (i.e. on a wide variety of hardware setups) we’ll move into the Beta stage. No more major features will go into 1.0 at that point. Oh yeah, the price will go up too
The last 6+ months have been a labor of love.I’ve been pouring over code, debugging, designing and generally being a huge nerd during my time away from the dreaded nine-to-five.
By day, I’m an automation guy. That means I write tools, automated tests and even get to do the occasional bit of web development (Django is the flavor de jour). The tough part about juggling the two lives isn’t so much the mix of doing C, C++, PERL, Python and other languages – it’s keeping my head wrapped around all the various code bases I’m responsible for. Thankfully I can navigate my way around Visual Studio, VIM and a bunch of other editors like a ninja and even when I don’t know where something is it isn’t too far out of reach.
I’ve mentioned the whole “coding for fun” thing to a few folks and more or less was looked at like I was from Jupiter. “When I get home the last thing I could do is sit down and do more work.” Well, I guess that’s what makes me so driven. It doesn’t feel like work. it feels like I’m creating something. Sure, it’s the same thing that I do at work but the end result of what I’m doing at home has far more creative thought put into it. Writing automated test scripts doesn’t exactly require much creativity….(I wonder if that’s why some people over-engineer things: because they are too creative for their job).
In the last twelve years I’ve had more side-projects than I care to recall but not a single one of them captured my focus like PhotoMonkee has. After six months I still look forward to designing and implementing new features. I think that’s also another reason I’m still so engaged…there’s no shortage of features to be had. Even though I’m starting to put the wraps on a beta candidate for 1.0 the sky is the limit as to what can be added to PhotoMonkee for functionality.
I can’t wait until the Monday I wake up and go to work….on PhotoMonkee.