<?php
/**
* Get a specific item
*
* @package xyzhelper
**/
/**
* Get a specific item
*
* Standard function of a module to retrieve a specific item
*
* @src the image name source
* @width the image width (or height if portrait) (DEFAULT:$height)
* @height the image height (or width if portrait) (DEFAULT:$width)
* @crop whether or not to crop the image instead of resizing to the largest portion (DEFAULT:FALSE)
* @autorot whether or not to autorotate the image (DEFAULT:TRUE)
* @wm the watermarks logo
* @wmpos the postition of the watermark ('TR','TL','BR','BL')
* @wmtrans the transparency of the watmark
* @logo the logo (across the bottom of the screen)
* @t1 the first text on the image
* @t1x the xpos of the text
* @t1y the ypos of the text
* @t1font the font of the text
* @t1size the size of the font
* @t1color the color of the font
* @t2 the second text of the image
* @t2x the xpos of the text
* @t2y the ypos of the text
* @t2font the font of the text
* @t2size the size of the font
* @t2color the color of the font
* @qlty the quality of the image
* @return url string
* @throws BAD_PARAM, DATABASE_ERROR, NO_PERMISSION
*/
function xyzhelper_userapi_processimage($args)
{
//version number allows for upgrades to automagically create a new file when processing code is updated
$args['version']='0.3.1';
extract($args);
//don't really care if the alt is different its the same image
$args['alt']='';
//TODO: need some verification here
//check db if has alreqady be generated
//make hash of the file and options
//make strings out of the args (source is an id so unique reguarless of name)
//connect to database
$dbconn =& xarDBGetConn();
$xartable =& xarDBGetTables();
$xyzhelpertable = $xartable['xyzhelperimages'];
foreach ($args as $key => $value) {
$items[]= $key .'="'. $value .'"';
}
$string=implode(',', $items);
//make the hash
$hash=bin2hex(md5($string,true));
$query = "SELECT xar_photoname,
xar_processing,
xar_width,
xar_height,
xar_week
FROM $xyzhelpertable
WHERE xar_photoid = ?";
$result = &$dbconn->Execute($query,array($hash));
if (!$result) return;
//if the result is empty then we generate the image
if ($result->EOF) {
$result->Close();
if (!isset($src)) {
//TODO: log an error
return;
}
$imageInfo = xarModAPIFunc('images', 'user', 'getimageinfo', array('fileId' => $src));
//the info is in the $imageInfo: most retarted comment ever
$uploadsdir = xarModGetVar('uploads', 'path.uploads-directory');
$sourcepath = $imageInfo['fileLocation'];
switch ($imageInfo['imageType']) {
case 2:
//jpg
$photoname=basename($imageInfo['fileName'],'.jgp');
$source=imageCreateFromJPEG($sourcepath);
break;
case 1:
//gif
$photoname=basename($imageInfo['fileName'],'.gif');
$source=imageCreateFromGIF($sourcepath);
break;
default:
return false;
break;
}
//add to the db and flag as under generation
$query = "INSERT INTO $xyzhelpertable (
xar_photoid,
xar_photoname,
xar_processing)
VALUES (?,?,?)";
$bindvars=array($hash,$photoname,1);
//$result = &$dbconn->Execute($query,$bindvars);
//if (!$result) return;
//date
$dateurl=date('WY');
//see if the folder exists
$currentpath=getcwd();
$savedir=$currentpath.'/var/renderedimages/'.$dateurl;
if (!file_exists($savedir)) {
mkdir($savedir);
//TODO:Error checking
}
//get the image
//use the function from image module
//this function only works with jpegs
//TODO: add some error checking here
$sourcesize = array('width'=>imagesx($source),
'height'=>imagesy($source));
if (!isset($width) && !isset($height)) {
$width=$sourcesize['width'];
$height=$sourcesize['height'];
}
if (!isset($width)) {
$width=$height;
}
if (!isset($height)) {
$height=$width;
}
if (!isset($crop)) {
$crop=FALSE;
}
if (!isset($autorot)) {
$autorot=TRUE;
}
if (isset($t1) && !isset($t1x) && !isset($t1y) && !isset($t1font) && !isset($t1size) && !isset($t1color)) {
//TODO:add some logging
return;
}
if (isset($t2) && !isset($t2x) && !isset($t2y) && !isset($t2font) && !isset($t2size) && !isset($t2color)) {
//TODO:add some logging
return;
}
//$wm requires $wmpos and $wmtrans parameters
if (isset($wm) && (!isset($wmpos) | !isset($wmtrans))) {
//TODO: log an error
return;
}
if (!isset($qlty)) {
$qlty=75;
}
if (!isset($alt)) {
$alt='';
}
//first task is to resize and rotate (no reason to rotate the full size image)
//calculate aspect ratio
$aspectratio=$sourcesize['width']/$sourcesize['height'];
if ($aspectratio>=1) {
$resizewidth=$width;
$resizeheight=$height;
} else {
$resizeheight=$width;
$resizewidth=$height;
}
$resizear=$resizewidth/$resizeheight;
//assume largest dimension maximum
//action depends on crop setting
if ($crop) {
if ($resizear<=$aspectratio) {
$removalwidth=$resizear*$sourcesize['height'];
$cropdims['x1']=round($sourcesize['width']/2-$removalwidth/2);
$cropdims['x2']=round(($sourcesize['width']/2+$removalwidth/2)-$cropdims['x1']);
$cropdims['y1']=0;
$cropdims['y2']=$sourcesize['height'];
} else {
$removalheight=$sourcesize['width']/$resizear;
$cropdims['y1']=round($sourcesize['height']/2-$removalheight/2);
$cropdims['y2']=round(($sourcesize['height']/2+$removalheight/2)-$cropdims['y1']);
$cropdims['x1']=0;
$cropdims['x2']=$sourcesize['width'];
}
//create dest image
$dest=imagecreatetruecolor($resizewidth,$resizeheight);
//copy over
imagecopyresampled($dest,$source,0,0,$cropdims['x1'],$cropdims['y1'],$resizewidth,$resizeheight,$cropdims['x2'],$cropdims['y2']);
} else {
//assumes that the large dimension is width for landscape oreientation
if ($resizear>=$aspectratio) {
$resizewidth=$resizeheight*$aspectratio;
} else {
$resizeheight=$resizewidth/$aspectratio;
}
//make the destination image
$dest=imagecreatetruecolor($resizewidth,$resizeheight);
//copy the image
imagecopyresampled($dest,$source,0,0,0,0,$resizewidth,$resizeheight,$sourcesize['width'],$sourcesize['height']);
}
//rotate image
if ($autorot) {
if ($exif_data = @exif_read_data($sourcepath, 'IFD0')) {
switch (@$exif_data['Orientation']) {
case 1:
$rotate_angle = 0;
break;
case 3:
$rotate_angle = 180;
break;
case 6:
$rotate_angle = 270;
break;
case 8:
$rotate_angle = 90;
break;
default:
return false;
break;
}
//preform the roation
//TODO: look at replacing this with JPEGTRANS?
$dest = imagerotate($dest, $rotate_angle,0);
//small issue here need to recopy the image
}
}
//get the new size of the image
$destsize = array('width'=>imagesx($dest),
'height'=>imagesy($dest));
$newdest=imagecreatetruecolor($destsize['width'],$destsize['height']);
imagecopy($newdest,$dest,0,0,0,0,$destsize['width'],$destsize['height']);
imageDestroy($dest);
$dest=$newdest;
//watermark the image
if (isset($wm)) {
//work out the position
$watermark=imageCreateFromPNG($wm);
$watermarksize = array('width'=>imagesx($watermark),
'height'=>imagesy($watermark));
$watermarkmargin=50;
//copied from phpthumb
switch ($wmpos) {
case 'T':
$watermark_destination_x = round((($destsize['width'] / 2) - ($watermarksize['width'] / 2)) + $watermarkmargin);
$watermark_destination_y = $watermarkmargin;
break;
case 'B':
$watermark_destination_x = round((($destsize['width'] / 2) - ($watermarksize['width'] / 2)) + $watermarkmargin);
$watermark_destination_y = round(($destsize['height'] - $watermarksize['height']) * $watermarkmargin);
break;
case 'L':
$watermark_destination_x = $watermarkmargin;
$watermark_destination_y = round((($destsize['height'] / 2) - ($watermarksize['height'] / 2)) + $watermarkmargin);
break;
case 'R':
$watermark_destination_x = round(($destsize['width'] - $watermarksize['width']) * $watermarkmargin);
$watermark_destination_y = round((($destsize['height'] / 2) - ($watermarksize['height'] / 2)) + $watermarkmargin);
break;
case 'C':
$watermark_destination_x = round(($destsize['width'] / 2) - ($watermarksize['width'] / 2));
$watermark_destination_y = round(($destsize['height'] / 2) - ($watermarksize['height'] / 2));
break;
case 'TL':
$watermark_destination_x = $watermarkmargin;
$watermark_destination_y = $watermarkmargin;
break;
case 'TR':
$watermark_destination_x = round(($destsize['width'] - $watermarksize['width']) * $watermarkmargin);
$watermark_destination_y = $watermarkmargin;
break;
case 'BL':
$watermark_destination_x = $watermarkmargin;
$watermark_destination_y = round(($destsize['height'] - $watermarksize['height']) * $watermarkmargin);
break;
case 'BR':
default:
$watermark_destination_x = round(($destsize['width'] - $watermarksize['width']) * $watermarkmargin);
$watermark_destination_y = round(($destsize['height'] - $watermarksize['height']) * $watermarkmargin);
break;
}
//place the watermark
imageCopyMerge($dest, $watermark, $watermark_destination_x, $watermark_destination_y, 0, 0,$watermarksize['width'], $watermarksize['height'],$wmtrans);
}
//add the logo
if (isset($logo)) {
$logoimg=imageCreateFromPNG($logo);
$logosize = array('width'=>imagesx($logoimg),
'height'=>imagesy($logoimg));
imageCopy($dest, $logoimg, 0, ($destsize['height'] - $logosize['height']), 0, 0,$logosize['width'], $logosize['height']);
}
// add text 1
if (isset($t1)) {
$t1color=watermark_hex2int($t1color);
$t1color = imageColorAllocateAlpha($dest, $t1color['r'], $t1color['g'], $t1color['b'], 0);
//reference from bottom left
imageFTText($dest, $t1size, 0, $t1x, $destsize['height']-$t1y, $t1color,$t1font, $t1, array());
}
if (isset($t2)) {
$t2color=watermark_hex2int($t2color);
$t2color = imageColorAllocateAlpha($dest, $t2color['r'], $t2color['g'], $t2color['b'], 0);
//reference from bottom left
imageFTText($dest, $t2size, 0, $t2x, $destsize['height']-$t2y, $t2color,$t2font, $t2, array());
}
$currentpath=getcwd();
$destpath=$savedir. '/'. $photoname . $hash . '.jpg';
imageJPEG($dest,$destpath,$qlty);
//update that processing is done
$query = "UPDATE $xyzhelpertable SET
xar_processing = 0,
xar_width = $width,
xar_height = $height,
xar_week = $dateurl
where xar_photoid = ?";
$bindvars=array($hash);
//$result = &$dbconn->Execute($query,$bindvars);
//if (!$result) return;
} else {
//check if processing, if processing swing around until done
//list ($photoname,$processing,$tagwidth,$tagheight,$urlweek) = $result->fields;
$result->Close();
$i=1;
while (($i<20) && ($processing)) {
//sleep for half a second
sleep(0.5);
//rerun the query
$query = "SELECT xar_processing
FROM $xyzhelpertable
WHERE xar_photoid = ?";
$result = &$dbconn->Execute($query,array($hash));
list ($processing) = $result->fields;
$result->Close();
//jump out if we've been going for more then 10 s
$i++;
}
}
//make the url
//$urlroot=xarModGetVar('xyzhelper','imageurlroot');
$urlroot='var/renderedimages/'.$dateurl.'/';
//$url=$urlroot . $urlweek . '/' . $photoname . $hash . '.jpg';
$url=$urlroot . $photoname . $hash . '.jpg';
return array($url,$width,$height,$alt);
}
function watermark_hex2int($hex) {
return array('r' => hexdec(substr($hex, 0, 2)),
'g' => hexdec(substr($hex, 2, 2)),
'b' => hexdec(substr($hex, 4, 2))
);
}