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;
}
?>