Image resize in PHP

Recently I have been working on a Content Management System for Toshiba TEC Australia. Basically we have built a recipe printer kiosk application that allows you to browse recipes, share them on social networks, email, and also to print them in-store, leveraging a serial printer installed on the kiosk.

The CMS I’ve ben working on lets you add new recipes, modify existing ones, manage categories etc.. I built it in Flex using PHP as a server-side language. Every recipe can have an image associated with it, so in my CMS I have provided a form to handle file upload, and delegated the resize of the image to PHP.

I found this great class, SimpleImage that allows you to resize and scale images, and I have added a little function to it, as I thought there was something missing:

function resizeWH($maxWidth, $maxHeight)

{

$currentWidth = $this->getWidth();

$currentHeight = $this->getHeight();

if($currentWidth > $currentHeight)

$this -> resizeToWidth($maxWidth);

else

$this -> resizeToHeight($maxHeight);

}

You basically specify the maximum width and height you want your image to be resized at, and the function just determines if your image has a landscape or portrait orientation, so it can resize it without changing it’s aspect ratio.

Advertisements

Build and install your AIR for iOS apps with a single bash script

Every one of us, who has developed an application for iOS using Adobe AIR, knows how long and painful is the process of testing the app on a iDevice. If you develop native obj-C applications using Xcode you can simply hit a button and the IDE will just build it and install it for you. The workflow for Flash developers instead, as suggested by Adobe itself is the following:

  1. Build the app using the launch method “On device” (either Standard or Fast)
  2. Uninstall the app from the device
  3. Go to iTunes (or any equivalent software) and drag-drop the generated ipa file in the Apps tab on the left sidebar
  4. Still from iTunes, go to the device tab and drag-drop the app onto the device screen (or select it in the left column) and hit “Sync”

Now, it might look easy, but if you think about doing it tens of times in a day, I assure you, it’s a real pain in the butt. Not just for the amount of time wasted, but also for the amount of clicks, drags, drops etc. What if you could just run a script from the terminal and then sit and relax, while the script does all the “dirty” job for you? After some research, I found this fantastic blog post from Tom Krcha, talking about good practices to compile, install and profile your app for iOS. Thanks to the links contained in the post I have built a simple bash script that I thought could be worthwhile sharing.

#!/bin/bash

echo “# Compiler: Packaging app, Sir.”;

case $1 in

test)

/Applications/Adobe\ Flash\ Builder\ 4.6/sdks/4.6.0/bin/adt -package -target ipa-debug-interpreter -provisioning-profile PATH-TO-PROVISIONING-FILE -storetype pkcs12 -keystore PATH-TO-P12-CERTIFICATE – storepass “your-certificate-password” OUTPUT-IPA-PATH PATH-TO-XML-APP-DESCRIPTOR-FILE PATH-TO-SWF-FILE PATH-TO-OPTIONAL-ASSETS-FOLDER;

transporter_chief.rb OUTPUT-IPA-PATH;; #<— This will install your app on the device, so make sure it’s connected to your USB

release)

/Applications/Adobe\ Flash\ Builder\ 4.6/sdks/4.6.0/bin/adt -package –target ipa-app-store -provisioning-profile PATH-TO-PROVISIONING-FILE -storetype pkcs12 -keystore PATH-TO-P12-CERTIFICATE -storepass “your-certificate-password” OUTPUT-IPA-PATH PATH-TO-XML-APP-DESCRIPTOR-FILE PATH-TO-SWF-FILE PATH-TO-OPTIONAL-ASSETS-FOLDER;

transporter_chief.rb OUTPUT-IPA-PATH;;

*)

/Applications/Adobe\ Flash\ Builder\ 4.6/sdks/4.6.0/bin/adl -runtime /Applications/Adobe\ Flash\ Builder\ 4.6/sdks/4.6.0/runtimes/air/mac -profile mobileDevice -screensize 768×1004:768×1024 -XscreenDPI 132 -XversionPlatform IOS PATH-TO-XML-APP-DESCRIPTOR-FILE PATH-TO_OUTPUT-FOLDER;;

esac

Let’s see what it does: As you can see it’s just a simple Switch/Case statement. You can provide an optional argument [test | release] to the script, and you can see it represents one of the cases in the main Switch:

  • If you pass “test” as an argument, the script will build your app using the quick method (note -target ipa-debug-interpreter) , the same you can select in the Flash Builder, which is fast but you know performances are ridiculous. Useful for quick tests.
  • If you pass “release”, the script will build using the slow method (note –target ipa-app-store), which is slow but performances are optimal.
  • If you don’t specify an argument, the switch will go through the default case “*)” and run you app in the desktop simulator (in this case simulating an iPad, as you can see from the argument -screensize 768×1004:768×1024)

The script makes use of the adt package command, whose documentation can be found here. It also uses transporter_chief.rb, a Ruby script that you can find here, to beam the compiled app to your device. Have a look at it and make it work as a first step. My script is just a simple idea to save time, you can build your own with some basic bash programming skills. Read the doc and create your own script to fit your needs, like different screenSize, or screenDPI, etc.. Hope you find it useful.

Getting photo orientation from EXIF data on iOS (AIR)

Recently I’ve been working a lot on iPad using Adobe AIR, which is really good to quickly create iOS applications, but of course it has it’s limitations.

One of these is that when you shoot a picture using CameraUI, and you rotate your iDevice, your image comes out rotated.

How can you find out the device orientation in order to adjust the picture rotation?

The answer resides in the EXIF metadata! Actually, EXIF data contains a whole bunch of hidden information about your file, including an “Orientation” tag that can have 5 different values:

  • 1 – LANDSCAPE
  • 3 – LANDSCAPE_REVERSE
  • 6 – PORTRAIT
  • 8 – PORTRAIT_REVERSE
  • 9 – UNKNOWN

So, once you have this value, you just need to rotate your Bitmap, or BitmapData, or whatever you have, according to this value and to the current device orientation. I want to use my situation as an example:

  1. You have an iPad application running in Landscape mode.
  2. Your application launches CameraUI to take a photo.
  3. You rotate your iPad in LANDSCAPE mode and shoot the photo.
  4. Your app closes the CameraUI and goes back to Landscape mode.

In this case, the picture you have just taken will appear rotated by 90 degrees!

So, how do you get the orientation value??? 

Thanks to this fantastic post by Christian Cantrell I found out… [to-be-continued]