Make CIP images for Cisco IP phones in PHP

Submitted by Stefan Gofferje on Tue, 04/26/2011 - 10:33

I found several scripts to create CIP files in the web but none of them really worked 100%. This script is a modified version of a script I found at PHP.net. It SHOULD work 100%. It's meant as an include file and it provides 2 functions.


makecipfromfile(filename:string) - creates a CIP image from a file
makecipfromressource(ressource:imageressource) - creates a CIP image from a PHP image ressource

The functions both return all image-relevant tags (<Width />, <Height />, <Depth /> and of course <Data />) for a CiscoIPPhoneImage or CiscoIPPhoneStatus object.

Example use:

<?php
 include "makecip.php";
 header("Content-type: text/xml; charset=iso-8859-1");
 header("Connection: Keep-Alive");
 header("Cache-Control: private");
?>
 
<CiscoIPPhoneImage>
  <Title>bla</Title>
  <LocationX>0</LocationX>
  <LocationY>0</LocationY>
  <?php print makecipfromfile("image.gif"); ?>
</CiscoIPPhoneImage>

Here is the script now:

<?php

function makecipfromfile($IMAGESOURCE) {

//Sets the max width and height for the image
$MAXWIDTH = 133;
$MAXHEIGHT = 65;

//Sets the display location on the phone
$LOCATIONX = -1;
$LOCATIONY = -1;

//Sets the decimal RGB ranges for binary conversion
$LOW = 100;
$MEDIUM = 150;
$HIGH = 200;

/*************** PROBABLY NO NEED TO EDIT BELOW HERE ***************/

//Checks to see if the image exists
if (strtolower(substr($IMAGESOURCE,0,7)) == "http://") {
$IMAGEHEADER = @get_headers($IMAGESOURCE);
if (!preg_match("|200|", $IMAGEHEADER0)) {
echo "ERROR:\n\nRemote Image Does Not Exist\n\n"; exit; }}
elseif (!file_exists($IMAGESOURCE)) {
echo "ERROR:\n\nImage Does Not Exist\n\n"; exit; }

//Creates a cached copy of the image based on the extension
if (strtolower(substr($IMAGESOURCE,-3,3)) == "gif") {
$IMAGECACHE = @imagecreatefromgif($IMAGESOURCE); }
elseif (strtolower(substr($IMAGESOURCE,-3,3)) == "jpg") {
$IMAGECACHE = @imagecreatefromjpeg($IMAGESOURCE); }
elseif (strtolower(substr($IMAGESOURCE,-3,3)) == "png") {
$IMAGECACHE = @imagecreatefrompng($IMAGESOURCE); }
else { echo "ERROR:\n\nImage Format Not Recognized\n\n"; exit; }

//Gets the width and height of the image
list($IMAGEWIDTH, $IMAGEHEIGHT) = getimagesize($IMAGESOURCE);

//Gets the width to height ratio of the image
$SOURCERATIO = $IMAGEWIDTH/$IMAGEHEIGHT;

//Checks to see if the image needs resizing
if ($IMAGEWIDTH <= $MAXWIDTH && $IMAGEHEIGHT <= $MAXHEIGHT) {
$RESIZEDWIDTH = $IMAGEWIDTH;
$RESIZEDHEIGHT = $IMAGEHEIGHT; }
elseif ($IMAGEWIDTH <= $MAXWIDTH && $IMAGEHEIGHT > $MAXHEIGHT) {
$RESIZEDHEIGHT = $MAXHEIGHT;
$RESIZEDWIDTH = ceil($MAXHEIGHT*$SOURCERATIO); }
elseif ($IMAGEWIDTH > $MAXWIDTH && $IMAGEHEIGHT <= $MAXHEIGHT) {
$RESIZEDWIDTH = $MAXWIDTH;
$RESIZEDHEIGHT = ceil($MAXWIDTH/$SOURCERATIO); }
elseif ($IMAGEWIDTH > $MAXWIDTH && $IMAGEHEIGHT > $MAXHEIGHT) {
$WIDTHDIFF = $IMAGEWIDTH-$MAXWIDTH;
$HEIGHTDIFF = $IMAGEHEIGHT-$MAXHEIGHT;
if ($WIDTHDIFF < $HEIGHTDIFF) {
$RESIZEDHEIGHT = $MAXHEIGHT;
$RESIZEDWITH = ceil($MAXHEIGHT*$SOURCERATIO); }
elseif ($WIDTHDIFF > $HEIGHTDIFF) {
$RESIZEDWIDTH = $MAXWIDTH;
$RESIZEDHEIGHT = ceil($MAXWIDTH/$SOURCERATIO); }
elseif ($WIDTHDIFF == $HEIGHTDIFF) {
$RESIZEDWIDTH = $MAXWIDTH;
$RESIZEDHEIGHT = $MAXHEIGHT; }}

//Create new resized image
$RESIZEDIMAGE = imagecreatetruecolor($RESIZEDWIDTH, $RESIZEDHEIGHT);
imagecopyresampled($RESIZEDIMAGE, $IMAGECACHE, 0, 0, 0, 0, $RESIZEDWIDTH, $RESIZEDHEIGHT, $IMAGEWIDTH,
$IMAGEHEIGHT);

//Sets an empty variable for future use
$BINARYFULL = "";
$RESULT="";

$RESULT.= "<Width>$RESIZEDWIDTH</Width>\n";
$RESULT.= "<Height>$RESIZEDHEIGHT</Height>\n";
$RESULT.= "<Depth>2</Depth>\n";
$RESULT.= "<Data>";

//Gets the red RGB value for each pixel in the image
for ($Y=0;$Y<$RESIZEDHEIGHT;$Y++) {
for ($X=0;$X<$RESIZEDWIDTH;$X++) {
$COLORINDEX = imagecolorat($RESIZEDIMAGE,$X,$Y);
$RGBDEC = imagecolorsforindex($RESIZEDIMAGE,$COLORINDEX);
$RED = $RGBDEC['red'];

//Converts each pixel from red RGB value to 2-bit binary
if ($RED < $LOW) { $TWOBIT = "11"; }
elseif ($RED >= $LOW && $RED < $MEDIUM) { $TWOBIT = "10"; }
elseif ($RED >= $MEDIUM && $RED < $HIGH) { $TWOBIT = "01"; }
elseif ($RED >= $HIGH) { $TWOBIT = "00"; }

//Sets the 2-bit binary string for each pixel
$BINARYFULL .= $TWOBIT; }}

//Parses the string and reorders the binary pairs
$i = 0;
while ($i <= strlen($BINARYFULL)) {
$EIGHTBIT = substr($BINARYFULL,$i,8);
$TWOBIT1 = substr($EIGHTBIT,6,2);
$TWOBIT2 = substr($EIGHTBIT,4,2);
$TWOBIT3 = substr($EIGHTBIT,2,2);
$TWOBIT4 = substr($EIGHTBIT,0,2);
$EIGHTBITFLIP = $TWOBIT1 . $TWOBIT2 . $TWOBIT3 . $TWOBIT4;

//Converts the reordered binary byte to decimal and then to hexidecmal
$OUTPUT = dechex(bindec($EIGHTBITFLIP));

//Pads single value binary bits and outputs the result
if (strlen($OUTPUT)==1) { $RESULT .= "0" . $OUTPUT; }
else { $RESULT .= $OUTPUT; }
$i = $i+8; }

//Outputs the closing Cisco XML tags
$RESULT .= "</Data>";

//Frees any memory associated with cached images
imagedestroy($IMAGECACHE);
imagedestroy($RESIZEDIMAGE);

return $RESULT;

}

function makecipfromressource($IMAGESOURCE) {

//Sets the max width and height for the image
$MAXWIDTH = 133;
$MAXHEIGHT = 65;

//Sets the display location on the phone
$LOCATIONX = -1;
$LOCATIONY = -1;

//Sets the decimal RGB ranges for binary conversion
$LOW = 100;
$MEDIUM = 150;
$HIGH = 200;

/*************** PROBABLY NO NEED TO EDIT BELOW HERE ***************/

$IMAGECACHE = $IMAGESOURCE;

//Gets the width and height of the image
$IMAGEWIDTH=imagesx($IMAGECACHE);
$IMAGEHEIGHT=imagesy($IMAGECACHE);

//Gets the width to height ratio of the image
$SOURCERATIO = $IMAGEWIDTH/$IMAGEHEIGHT;

//Checks to see if the image needs resizing
if ($IMAGEWIDTH <= $MAXWIDTH && $IMAGEHEIGHT <= $MAXHEIGHT) {
$RESIZEDWIDTH = $IMAGEWIDTH;
$RESIZEDHEIGHT = $IMAGEHEIGHT; }
elseif ($IMAGEWIDTH <= $MAXWIDTH && $IMAGEHEIGHT > $MAXHEIGHT) {
$RESIZEDHEIGHT = $MAXHEIGHT;
$RESIZEDWIDTH = ceil($MAXHEIGHT*$SOURCERATIO); }
elseif ($IMAGEWIDTH > $MAXWIDTH && $IMAGEHEIGHT <= $MAXHEIGHT) {
$RESIZEDWIDTH = $MAXWIDTH;
$RESIZEDHEIGHT = ceil($MAXWIDTH/$SOURCERATIO); }
elseif ($IMAGEWIDTH > $MAXWIDTH && $IMAGEHEIGHT > $MAXHEIGHT) {
$WIDTHDIFF = $IMAGEWIDTH-$MAXWIDTH;
$HEIGHTDIFF = $IMAGEHEIGHT-$MAXHEIGHT;
if ($WIDTHDIFF < $HEIGHTDIFF) {
$RESIZEDHEIGHT = $MAXHEIGHT;
$RESIZEDWITH = ceil($MAXHEIGHT*$SOURCERATIO); }
elseif ($WIDTHDIFF > $HEIGHTDIFF) {
$RESIZEDWIDTH = $MAXWIDTH;
$RESIZEDHEIGHT = ceil($MAXWIDTH/$SOURCERATIO); }
elseif ($WIDTHDIFF == $HEIGHTDIFF) {
$RESIZEDWIDTH = $MAXWIDTH;
$RESIZEDHEIGHT = $MAXHEIGHT; }}

//Create new resized image
$RESIZEDIMAGE = imagecreatetruecolor($RESIZEDWIDTH, $RESIZEDHEIGHT);
imagecopyresampled($RESIZEDIMAGE, $IMAGECACHE, 0, 0, 0, 0, $RESIZEDWIDTH, $RESIZEDHEIGHT, $IMAGEWIDTH,
$IMAGEHEIGHT);

//Sets an empty variable for future use
$BINARYFULL = "";
$RESULT="";

$RESULT.= "<Width>$RESIZEDWIDTH</Width>\n";
$RESULT.= "<Height>$RESIZEDHEIGHT</Height>\n";
$RESULT.= "<Depth>2</Depth>\n";
$RESULT.= "<Data>";

//Gets the red RGB value for each pixel in the image
for ($Y=0;$Y<$RESIZEDHEIGHT;$Y++) {
for ($X=0;$X<$RESIZEDWIDTH;$X++) {
$COLORINDEX = imagecolorat($RESIZEDIMAGE,$X,$Y);
$RGBDEC = imagecolorsforindex($RESIZEDIMAGE,$COLORINDEX);
$RED = $RGBDEC['red'];

//Converts each pixel from red RGB value to 2-bit binary
if ($RED < $LOW) { $TWOBIT = "11"; }
elseif ($RED >= $LOW && $RED < $MEDIUM) { $TWOBIT = "10"; }
elseif ($RED >= $MEDIUM && $RED < $HIGH) { $TWOBIT = "01"; }
elseif ($RED >= $HIGH) { $TWOBIT = "00"; }

//Sets the 2-bit binary string for each pixel
$BINARYFULL .= $TWOBIT; }}

//Parses the string and reorders the binary pairs
$i = 0;
while ($i <= strlen($BINARYFULL)) {
$EIGHTBIT = substr($BINARYFULL,$i,8);
$TWOBIT1 = substr($EIGHTBIT,6,2);
$TWOBIT2 = substr($EIGHTBIT,4,2);
$TWOBIT3 = substr($EIGHTBIT,2,2);
$TWOBIT4 = substr($EIGHTBIT,0,2);
$EIGHTBITFLIP = $TWOBIT1 . $TWOBIT2 . $TWOBIT3 . $TWOBIT4;

//Converts the reordered binary byte to decimal and then to hexidecmal
$OUTPUT = dechex(bindec($EIGHTBITFLIP));

//Pads single value binary bits and outputs the result
if (strlen($OUTPUT)==1) { $RESULT .= "0" . $OUTPUT; }
else { $RESULT .= $OUTPUT; }
$i = $i+8; }

//Outputs the closing Cisco XML tags
$RESULT .= "</Data>";

//Frees any memory associated with cached images
imagedestroy($IMAGECACHE);
imagedestroy($RESIZEDIMAGE);

return $RESULT;

}

?>