Example #1
0
 public function writeMeta($metaarray)
 {
     $foundtags = array();
     foreach ($metaarray as $row => $value) {
         foreach ($this->definitions as $currentDef => $tagValue) {
             if ($row == $currentDef) {
                 // keywords must be handled
                 // they are keywords as array and not string
                 if ($row == "keywords") {
                     $totalString = "";
                     foreach ($value as $currentKeyword) {
                         $totalString .= $currentKeyword;
                     }
                     $foundtags[$tagValue] = $totalString;
                 } else {
                     $foundtags[$tagValue] = $value;
                 }
             }
         }
     }
     $data = "";
     foreach ($foundtags as $tag => $string) {
         $tag = substr($tag, 2);
         $data .= $this->IPTCmakeTag(2, $tag, $string);
     }
     $newContent = iptcembed($data, $this->path . $this->filename);
     $file = fopen($this->path . $this->filename, "wb");
     fwrite($file, $newContent);
     fclose($file);
 }
Example #2
0
 private function write()
 {
     $mode = 0;
     $content = iptcembed($this->binary(), $this->file, $mode);
     $filename = $this->file;
     if (file_exists($this->file)) {
         unlink($this->file);
     }
     $fp = fopen($this->file, "w");
     fwrite($fp, $content);
     fclose($fp);
 }
Example #3
0
 function write()
 {
     if (!function_exists('iptcembed')) {
         return false;
     }
     $mode = 0;
     $content = iptcembed($this->binary(), $this->file, $mode);
     $filename = $this->file;
     @unlink($filename);
     #delete if exists
     $fp = fopen($filename, "w");
     fwrite($fp, $content);
     fclose($fp);
 }
Example #4
0
function starter()
{
    //getMeta("./samples/","1.jpg");
    getMeta("./", "img.jpg");
    $iptc = array("2#120" => "Hello world", "2#025" => "Your keywords will be placed here", "2#116" => "Thomas Darvik heter jeg");
    $data = "";
    foreach ($iptc as $tag => $string) {
        $tag = substr($tag, 2);
        $data .= IPTCmakeTag(2, $tag, $string);
    }
    $content = iptcembed($data, "./img.jpg");
    $file = fopen("./img.jpg", "wb");
    fwrite($file, $content);
    fclose($file);
    getMeta("./", "img.jpg");
}
 public function create_iptc($source, $destination, $data)
 {
     // clear image tags
     $this->remove_tags($source);
     $image = getimagesize($source, $info);
     $iptc_data = "";
     foreach ($this->iptc_header_array as $key => $value) {
         $tag = substr($key, 2);
         $iptc_data .= $this->iptc_make_tag(2, $tag, $value . $key . $data);
     }
     // embed data into image
     $content = iptcembed($iptc_data, $source);
     $fp = fopen($destination, "wb");
     fwrite($fp, $content);
     fclose($fp);
 }
Example #6
0
 function write()
 {
     global $UNC_GALLERY;
     if ($UNC_GALLERY['debug']) {
         XMPP_ERROR_trace(__FUNCTION__, func_get_args());
     }
     if (!function_exists('iptcembed')) {
         if ($UNC_GALLERY['debug']) {
             XMPP_ERROR_trace(__FUNCTION__, "iptcembed Does not exist!!");
         }
         return false;
     }
     $mode = 0;
     $content = iptcembed($this->binary(), $this->file, $mode);
     $filename = $this->file;
     @unlink($filename);
     #delete if exists
     $fp = fopen($filename, "w");
     fwrite($fp, $content);
     fclose($fp);
 }
Example #7
0
 /**
  * Copies IPTC data from the source image to the cached file
  *
  * @since 2.0
  * @param string $cacheFilePath
  * @return boolean
  */
 private function copyIPTC($cacheFilePath)
 {
     $data = '';
     $iptc = $this->getSource()->iptc;
     // Originating program
     $iptc['2#065'] = array('Smart Lencioni Image Resizer');
     // Program version
     $iptc['2#070'] = array(SLIR::VERSION);
     foreach ($iptc as $tag => $iptcData) {
         $tag = substr($tag, 2);
         $data .= $this->makeIPTCTag(2, $tag, $iptcData[0]);
     }
     // Embed the IPTC data
     return iptcembed($data, $cacheFilePath);
 }
 /**
  * Generates a "clone" for an existing image, the clone can be altered using the $params array
  * @param string $image_path
  * @param string $clone_path
  * @param array $params
  * @return object
  */
 public function generate_image_clone($image_path, $clone_path, $params)
 {
     $crop = isset($params['crop']) ? $params['crop'] : NULL;
     $watermark = isset($params['watermark']) ? $params['watermark'] : NULL;
     $reflection = isset($params['reflection']) ? $params['reflection'] : NULL;
     $rotation = isset($params['rotation']) ? $params['rotation'] : NULL;
     $flip = isset($params['flip']) ? $params['flip'] : NULL;
     $destpath = NULL;
     $thumbnail = NULL;
     $result = $this->object->calculate_image_clone_result($image_path, $clone_path, $params);
     // XXX this should maybe be removed and extra settings go into $params?
     $settings = C_NextGen_Settings::get_instance();
     // Ensure we have a valid image
     if ($image_path && @file_exists($image_path) && $result != null && !isset($result['error'])) {
         $image_dir = dirname($image_path);
         $clone_path = $result['clone_path'];
         $clone_dir = $result['clone_directory'];
         $clone_format = $result['clone_format'];
         $format_list = $this->object->get_image_format_list();
         // Ensure target directory exists, but only create 1 subdirectory
         if (!@file_exists($clone_dir)) {
             if (strtolower(realpath($image_dir)) != strtolower(realpath($clone_dir))) {
                 if (strtolower(realpath($image_dir)) == strtolower(realpath(dirname($clone_dir)))) {
                     wp_mkdir_p($clone_dir);
                 }
             }
         }
         $method = $result['method'];
         $width = $result['width'];
         $height = $result['height'];
         $quality = $result['quality'];
         if ($quality == null) {
             $quality = 100;
         }
         if ($method == 'wordpress') {
             $original = wp_get_image_editor($image_path);
             $destpath = $clone_path;
             if (!is_wp_error($original)) {
                 $original->resize($width, $height, $crop);
                 $original->set_quality($quality);
                 $original->save($clone_path);
             }
         } else {
             if ($method == 'nextgen') {
                 $destpath = $clone_path;
                 $thumbnail = new C_NggLegacy_Thumbnail($image_path, true);
                 if (!$thumbnail->error) {
                     if ($crop) {
                         $crop_area = $result['crop_area'];
                         $crop_x = $crop_area['x'];
                         $crop_y = $crop_area['y'];
                         $crop_width = $crop_area['width'];
                         $crop_height = $crop_area['height'];
                         $thumbnail->crop($crop_x, $crop_y, $crop_width, $crop_height);
                     }
                     $thumbnail->resize($width, $height);
                 } else {
                     $thumbnail = NULL;
                 }
             }
         }
         // We successfully generated the thumbnail
         if (is_string($destpath) && (@file_exists($destpath) || $thumbnail != null)) {
             if ($clone_format != null) {
                 if (isset($format_list[$clone_format])) {
                     $clone_format_extension = $format_list[$clone_format];
                     $clone_format_extension_str = null;
                     if ($clone_format_extension != null) {
                         $clone_format_extension_str = '.' . $clone_format_extension;
                     }
                     $destpath_info = M_I18n::mb_pathinfo($destpath);
                     $destpath_extension = $destpath_info['extension'];
                     if (strtolower($destpath_extension) != strtolower($clone_format_extension)) {
                         $destpath_dir = $destpath_info['dirname'];
                         $destpath_basename = $destpath_info['filename'];
                         $destpath_new = $destpath_dir . DIRECTORY_SEPARATOR . $destpath_basename . $clone_format_extension_str;
                         if (@file_exists($destpath) && rename($destpath, $destpath_new) || $thumbnail != null) {
                             $destpath = $destpath_new;
                         }
                     }
                 }
             }
             if (is_null($thumbnail)) {
                 $thumbnail = new C_NggLegacy_Thumbnail($destpath, true);
             } else {
                 $thumbnail->fileName = $destpath;
             }
             // This is quite odd, when watermark equals int(0) it seems all statements below ($watermark == 'image') and ($watermark == 'text') both evaluate as true
             // so we set it at null if it evaluates to any null-like value
             if ($watermark == null) {
                 $watermark = null;
             }
             if ($watermark == 1 || $watermark === true) {
                 if (in_array(strval($settings->wmType), array('image', 'text'))) {
                     $watermark = $settings->wmType;
                 } else {
                     $watermark = 'text';
                 }
             }
             $watermark = strval($watermark);
             if ($watermark == 'image') {
                 $thumbnail->watermarkImgPath = $settings['wmPath'];
                 $thumbnail->watermarkImage($settings['wmPos'], $settings['wmXpos'], $settings['wmYpos']);
             } else {
                 if ($watermark == 'text') {
                     $thumbnail->watermarkText = $settings['wmText'];
                     $thumbnail->watermarkCreateText($settings['wmColor'], $settings['wmFont'], $settings['wmSize'], $settings['wmOpaque']);
                     $thumbnail->watermarkImage($settings['wmPos'], $settings['wmXpos'], $settings['wmYpos']);
                 }
             }
             if ($rotation && in_array(abs($rotation), array(90, 180, 270))) {
                 $thumbnail->rotateImageAngle($rotation);
             }
             $flip = strtolower($flip);
             if ($flip && in_array($flip, array('h', 'v', 'hv'))) {
                 $flip_h = in_array($flip, array('h', 'hv'));
                 $flip_v = in_array($flip, array('v', 'hv'));
                 $thumbnail->flipImage($flip_h, $flip_v);
             }
             if ($reflection) {
                 $thumbnail->createReflection(40, 40, 50, FALSE, '#a4a4a4');
             }
             if ($clone_format != null && isset($format_list[$clone_format])) {
                 // Force format
                 $thumbnail->format = strtoupper($format_list[$clone_format]);
             }
             $thumbnail->save($destpath, $quality);
             // IF the original contained IPTC metadata we should attempt to copy it
             if (isset($detailed_size['APP13']) && function_exists('iptcembed')) {
                 $metadata = @iptcembed($detailed_size['APP13'], $destpath);
                 $fp = @fopen($destpath, 'wb');
                 @fwrite($fp, $metadata);
                 @fclose($fp);
             }
         }
     }
     return $thumbnail;
 }
Example #9
0
 /**
  * Resize the image proportionally to the given width/height
  *
  * Note: Some code used in this method is adapted from code found in comments at php.net for the GD functions
  *
  * @param int $targetWidth Target width in pixels, or 0 for proportional to height
  * @param int $targetHeight Target height in pixels, or 0 for proportional to width. Optional-if not specified, 0 is assumed.
  * @return bool True if the resize was successful
  *
  * @todo this method has become too long and needs to be split into smaller dedicated parts 
  *
  */
 public function ___resize($targetWidth, $targetHeight = 0)
 {
     $orientations = null;
     // @horst
     $needRotation = $this->autoRotation !== true ? false : ($this->checkOrientation($orientations) && (!empty($orientations[0]) || !empty($orientations[1])) ? true : false);
     $needResizing = true;
     // $this->isResizeNecessary($targetWidth, $targetHeight);
     //if(!$needResizing && !$needRotation) return true;
     $source = $this->filename;
     $dest = str_replace("." . $this->extension, "_tmp." . $this->extension, $source);
     $image = null;
     switch ($this->imageType) {
         // @teppo
         case IMAGETYPE_GIF:
             $image = @imagecreatefromgif($source);
             break;
         case IMAGETYPE_PNG:
             $image = @imagecreatefrompng($source);
             break;
         case IMAGETYPE_JPEG:
             $image = @imagecreatefromjpeg($source);
             break;
     }
     if (!$image) {
         return false;
     }
     if ($this->imageType != IMAGETYPE_PNG) {
         // @horst: linearize gamma to 1.0 - we do not use gamma correction with png because it doesn't respect transparency
         imagegammacorrect($image, 2.0, 1.0);
     }
     if ($needRotation) {
         // @horst
         $image = $this->imRotate($image, $orientations[0]);
         if ($orientations[0] == 90 || $orientations[0] == 270) {
             // we have to swap width & height now!
             $tmp = array($targetWidth, $targetHeight);
             $targetWidth = $tmp[1];
             $targetHeight = $tmp[0];
             $tmp = array($this->getWidth(), $this->getHeight());
             $this->setImageInfo($tmp[1], $tmp[0]);
         }
         if ($orientations[1] > 0) {
             $image = $this->imFlip($image, $orientations[1] == 2 ? true : false);
         }
     }
     if ($needResizing) {
         list($gdWidth, $gdHeight, $targetWidth, $targetHeight) = $this->getResizeDimensions($targetWidth, $targetHeight);
         $thumb = imagecreatetruecolor($gdWidth, $gdHeight);
         if ($this->imageType == IMAGETYPE_PNG) {
             // @adamkiss PNG transparency
             imagealphablending($thumb, false);
             imagesavealpha($thumb, true);
         } else {
             if ($this->imageType == IMAGETYPE_GIF) {
                 // @mrx GIF transparency
                 $transparentIndex = ImageColorTransparent($image);
                 $transparentColor = $transparentIndex != -1 ? ImageColorsForIndex($image, $transparentIndex) : 0;
                 if (!empty($transparentColor)) {
                     $transparentNew = ImageColorAllocate($thumb, $transparentColor['red'], $transparentColor['green'], $transparentColor['blue']);
                     $transparentNewIndex = ImageColorTransparent($thumb, $transparentNew);
                     ImageFill($thumb, 0, 0, $transparentNewIndex);
                 }
             } else {
                 $bgcolor = imagecolorallocate($thumb, 0, 0, 0);
                 imagefilledrectangle($thumb, 0, 0, $gdWidth, $gdHeight, $bgcolor);
                 imagealphablending($thumb, false);
             }
         }
         imagecopyresampled($thumb, $image, 0, 0, 0, 0, $gdWidth, $gdHeight, $this->image['width'], $this->image['height']);
         $thumb2 = imagecreatetruecolor($targetWidth, $targetHeight);
         if ($this->imageType == IMAGETYPE_PNG) {
             // @adamkiss PNG transparency
             imagealphablending($thumb2, false);
             imagesavealpha($thumb2, true);
         } else {
             if ($this->imageType == IMAGETYPE_GIF) {
                 // @mrx GIF transparency
                 if (!empty($transparentColor)) {
                     $transparentNew = ImageColorAllocate($thumb2, $transparentColor['red'], $transparentColor['green'], $transparentColor['blue']);
                     $transparentNewIndex = ImageColorTransparent($thumb2, $transparentNew);
                     ImageFill($thumb2, 0, 0, $transparentNewIndex);
                 }
             } else {
                 $bgcolor = imagecolorallocate($thumb2, 0, 0, 0);
                 imagefilledrectangle($thumb2, 0, 0, $targetWidth, $targetHeight, 0);
                 imagealphablending($thumb2, false);
             }
         }
         $w1 = $gdWidth / 2 - $targetWidth / 2;
         $h1 = $gdHeight / 2 - $targetHeight / 2;
         if (is_string($this->cropping)) {
             switch ($this->cropping) {
                 // @interrobang crop directions
                 case 'nw':
                     $w1 = 0;
                     $h1 = 0;
                     break;
                 case 'n':
                     $h1 = 0;
                     break;
                 case 'ne':
                     $w1 = $gdWidth - $targetWidth;
                     $h1 = 0;
                     break;
                 case 'w':
                     $w1 = 0;
                     break;
                 case 'e':
                     $w1 = $gdWidth - $targetWidth;
                     break;
                 case 'sw':
                     $w1 = 0;
                     $h1 = $gdHeight - $targetHeight;
                     break;
                 case 's':
                     $h1 = $gdHeight - $targetHeight;
                     break;
                 case 'se':
                     $w1 = $gdWidth - $targetWidth;
                     $h1 = $gdHeight - $targetHeight;
                     break;
                 default:
                     // center or false, we do nothing
             }
         } else {
             if (is_array($this->cropping)) {
                 // @interrobang + @u-nikos
                 if (strpos($this->cropping[0], '%') === false) {
                     $pointX = (int) $this->cropping[0];
                 } else {
                     $pointX = $gdWidth * ((int) $this->cropping[0] / 100);
                 }
                 if (strpos($this->cropping[1], '%') === false) {
                     $pointY = (int) $this->cropping[1];
                 } else {
                     $pointY = $gdHeight * ((int) $this->cropping[1] / 100);
                 }
                 if ($pointX < $targetWidth / 2) {
                     $w1 = 0;
                 } else {
                     if ($pointX > $gdWidth - $targetWidth / 2) {
                         $w1 = $gdWidth - $targetWidth;
                     } else {
                         $w1 = $pointX - $targetWidth / 2;
                     }
                 }
                 if ($pointY < $targetHeight / 2) {
                     $h1 = 0;
                 } else {
                     if ($pointY > $gdHeight - $targetHeight / 2) {
                         $h1 = $gdHeight - $targetHeight;
                     } else {
                         $h1 = $pointY - $targetHeight / 2;
                     }
                 }
             }
         }
         imagecopyresampled($thumb2, $thumb, 0, 0, $w1, $h1, $targetWidth, $targetHeight, $targetWidth, $targetHeight);
         if ($this->sharpening && $this->sharpening != 'none') {
             $image = $this->imSharpen($thumb2, $this->sharpening);
         }
         // @horst
     }
     // write to file
     $result = false;
     switch ($this->imageType) {
         case IMAGETYPE_GIF:
             // correct gamma from linearized 1.0 back to 2.0
             imagegammacorrect($thumb2, 1.0, 2.0);
             $result = imagegif($thumb2, $dest);
             break;
         case IMAGETYPE_PNG:
             // convert 1-100 (worst-best) scale to 0-9 (best-worst) scale for PNG
             $quality = round(abs(($this->quality - 100) / 11.111111));
             $result = imagepng($thumb2, $dest, $quality);
             break;
         case IMAGETYPE_JPEG:
             // correct gamma from linearized 1.0 back to 2.0
             imagegammacorrect($thumb2, 1.0, 2.0);
             $result = imagejpeg($thumb2, $dest, $this->quality);
             break;
     }
     @imagedestroy($image);
     // @horst
     if (isset($thumb) && is_resource($thumb)) {
         @imagedestroy($thumb);
     }
     // @horst
     if (isset($thumb2) && is_resource($thumb2)) {
         @imagedestroy($thumb2);
     }
     // @horst
     if ($result === false) {
         if (is_file($dest)) {
             @unlink($dest);
         }
         return false;
     }
     unlink($source);
     rename($dest, $source);
     // @horst: if we've retrieved IPTC-Metadata from sourcefile, we write it back now
     if ($this->iptcRaw) {
         $content = iptcembed($this->iptcPrepareData(), $this->filename);
         if ($content !== false) {
             $dest = preg_replace('/\\.' . $this->extension . '$/', '_tmp.' . $this->extension, $this->filename);
             if (strlen($content) == @file_put_contents($dest, $content, LOCK_EX)) {
                 // on success we replace the file
                 unlink($this->filename);
                 rename($dest, $this->filename);
             } else {
                 // it was created a temp diskfile but not with all data in it
                 if (file_exists($dest)) {
                     @unlink($dest);
                 }
             }
         }
     }
     $this->loadImageInfo($this->filename);
     $this->modified = true;
     return true;
 }
/**
 * Creates the cache folder version of the image, including watermarking
 *
 * @param string $newfilename the name of the file when it is in the cache
 * @param string $imgfile the image name
 * @param array $args the cropping arguments
 * @param bool $allow_watermark set to true if image may be watermarked
 * @param string $theme the current theme
 * @param string $album the album containing the image
 */
function cacheImage($newfilename, $imgfile, $args, $allow_watermark = false, $theme, $album)
{
    @(list($size, $width, $height, $cw, $ch, $cx, $cy, $quality, $thumb, $crop, $thumbstandin, $passedWM, $adminrequest, $effects) = $args);
    // Set the config variables for convenience.
    $image_use_side = getOption('image_use_side');
    $upscale = getOption('image_allow_upscale');
    $allowscale = true;
    $sharpenthumbs = getOption('thumb_sharpen');
    $sharpenimages = getOption('image_sharpen');
    $id = NULL;
    $watermark_use_image = getAlbumInherited($album, 'watermark', $id);
    if (empty($watermark_use_image)) {
        $watermark_use_image = IMAGE_WATERMARK;
    }
    if (!$effects) {
        if ($thumb && getOption('thumb_gray')) {
            $effects = 'gray';
        } else {
            if (getOption('image_gray')) {
                $effects = 'gray';
            }
        }
    }
    $newfile = SERVERCACHE . $newfilename;
    if (DEBUG_IMAGE) {
        debugLog("cacheImage(\$imgfile=" . basename($imgfile) . ", \$newfilename={$newfilename}, \$allow_watermark={$allow_watermark}, \$theme={$theme}) \$size={$size}, \$width={$width}, \$height={$height}, \$cw={$cw}, \$ch={$ch}, \$cx=" . (is_null($cx) ? 'NULL' : $cx) . ", \$cy=" . (is_null($cy) ? 'NULL' : $cy) . ", \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop} \$image_use_side={$image_use_side}; \$upscale={$upscale};");
    }
    // Check for the source image.
    if (!file_exists($imgfile) || !is_readable($imgfile)) {
        imageError(gettext('Image not found or is unreadable.'), 'err-imagenotfound.png');
    }
    $rotate = false;
    if (zp_imageCanRotate() && getOption('auto_rotate')) {
        $rotate = getImageRotation($imgfile);
    }
    if ($im = zp_imageGet($imgfile)) {
        if ($rotate) {
            $im = zp_rotateImage($im, $rotate);
        }
        $w = zp_imageWidth($im);
        $h = zp_imageHeight($im);
        // Give the sizing dimension to $dim
        $ratio_in = '';
        $ratio_out = '';
        $crop = $crop || $cw != 0 || $ch != 0;
        if (!empty($size)) {
            $dim = $size;
            $width = $height = false;
            if ($crop) {
                $dim = $size;
                if (!$ch) {
                    $ch = $size;
                }
                if (!$cw) {
                    $cw = $size;
                }
            }
        } else {
            if (!empty($width) && !empty($height)) {
                $ratio_in = $h / $w;
                $ratio_out = $height / $width;
                if ($ratio_in > $ratio_out) {
                    // image is taller than desired, $height is the determining factor
                    $thumb = true;
                    $dim = $width;
                    if (!$ch) {
                        $ch = $height;
                    }
                } else {
                    // image is wider than desired, $width is the determining factor
                    $dim = $height;
                    if (!$cw) {
                        $cw = $width;
                    }
                }
            } else {
                if (!empty($width)) {
                    $dim = $width;
                    $size = $height = false;
                } else {
                    if (!empty($height)) {
                        $dim = $height;
                        $size = $width = false;
                    } else {
                        // There's a problem up there somewhere...
                        imageError(gettext("Unknown error! Please report to the developers at <a href=\"http://www.zenphoto.org/\">www.zenphoto.org</a>"), 'err-imagegeneral.png');
                    }
                }
            }
        }
        $sizes = propSizes($size, $width, $height, $w, $h, $thumb, $image_use_side, $dim);
        list($neww, $newh) = $sizes;
        if (DEBUG_IMAGE) {
            debugLog("cacheImage:" . basename($imgfile) . ": \$size={$size}, \$width={$width}, \$height={$height}, \$w={$w}; \$h={$h}; \$cw={$cw}, " . "\$ch={$ch}, \$cx={$cx}, \$cy={$cy}, \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop}, \$newh={$newh}, \$neww={$neww}, \$dim={$dim}, " . "\$ratio_in={$ratio_in}, \$ratio_out={$ratio_out} \$upscale={$upscale} \$rotate={$rotate} \$effects={$effects}");
        }
        if (!$upscale && $newh >= $h && $neww >= $w) {
            // image is the same size or smaller than the request
            $neww = $w;
            $newh = $h;
            $allowscale = false;
            if ($crop) {
                if ($width > $neww) {
                    $width = $neww;
                }
                if ($height > $newh) {
                    $height = $newh;
                }
            }
            if (DEBUG_IMAGE) {
                debugLog("cacheImage:no upscale " . basename($imgfile) . ":  \$newh={$newh}, \$neww={$neww}, \$crop={$crop}, \$thumb={$thumb}, \$rotate={$rotate}, watermark=" . $watermark_use_image);
            }
        }
        // Crop the image if requested.
        if ($crop) {
            if ($cw > $ch) {
                $ir = $ch / $cw;
            } else {
                $ir = $cw / $ch;
            }
            if ($size) {
                $neww = $size;
                $newh = $ir * $size;
            } else {
                $neww = $width;
                $newh = $height;
                if ($neww > $newh) {
                    if ($newh === false) {
                        $newh = $ir * $neww;
                    }
                } else {
                    if ($neww === false) {
                        $neww = $ir * $newh;
                    }
                }
            }
            if (is_null($cx) && is_null($cy)) {
                // scale crop to max of image
                // set crop scale factor
                $cf = 1;
                if ($cw) {
                    $cf = min($cf, $cw / $neww);
                }
                if ($ch) {
                    $cf = min($cf, $ch / $newh);
                }
                //	set the image area of the crop (use the most image possible, rule of thirds positioning)
                if (!$cw || $w / $cw * $ch > $h) {
                    $cw = round($h / $ch * $cw * $cf);
                    $ch = round($h * $cf);
                    $cx = round(($w - $cw) / 3);
                } else {
                    $ch = round($w / $cw * $ch * $cf);
                    $cw = round($w * $cf);
                    $cy = round(($h - $ch) / 3);
                }
            } else {
                // custom crop
                if (!$cw || $cw > $w) {
                    $cw = $w;
                }
                if (!$ch || $ch > $h) {
                    $ch = $h;
                }
            }
            // force the crop to be within the image
            if ($cw + $cx > $w) {
                $cx = $w - $cw;
            }
            if ($cx < 0) {
                $cw = $cw + $cx;
                $cx = 0;
            }
            if ($ch + $cy > $h) {
                $cy = $h - $ch;
            }
            if ($cy < 0) {
                $ch = $ch + $cy;
                $cy = 0;
            }
            if (DEBUG_IMAGE) {
                debugLog("cacheImage:crop " . basename($imgfile) . ":\$size={$size}, \$width={$width}, \$height={$height}, \$cw={$cw}, \$ch={$ch}, \$cx={$cx}, \$cy={$cy}, \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop}, \$rotate={$rotate}");
            }
            $newim = zp_createImage($neww, $newh);
            zp_resampleImage($newim, $im, 0, 0, $cx, $cy, $neww, $newh, $cw, $ch);
        } else {
            if ($allowscale) {
                $sizes = propSizes($size, $width, $height, $w, $h, $thumb, $image_use_side, $dim);
                list($neww, $newh) = $sizes;
            }
            if (DEBUG_IMAGE) {
                debugLog("cacheImage:no crop " . basename($imgfile) . ":\$size={$size}, \$width={$width}, \$height={$height}, \$dim={$dim}, \$neww={$neww}; \$newh={$newh}; \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop}, \$rotate={$rotate}; \$allowscale={$allowscale};");
            }
            $newim = zp_createImage($neww, $newh);
            zp_resampleImage($newim, $im, 0, 0, 0, 0, $neww, $newh, $w, $h);
        }
        $imgEffects = explode(',', $effects);
        if (in_array('gray', $imgEffects)) {
            zp_imageGray($newim);
        }
        if ($thumb && $sharpenthumbs || !$thumb && $sharpenimages) {
            zp_imageUnsharpMask($newim, getOption('sharpen_amount'), getOption('sharpen_radius'), getOption('sharpen_threshold'));
        }
        $watermark_image = false;
        if ($passedWM) {
            if ($passedWM != NO_WATERMARK) {
                $watermark_image = getWatermarkPath($passedWM);
                if (!file_exists($watermark_image)) {
                    $watermark_image = SERVERPATH . '/' . ZENFOLDER . '/images/imageDefault.png';
                }
            }
        } else {
            if ($allow_watermark) {
                $watermark_image = $watermark_use_image;
                if ($watermark_image) {
                    if ($watermark_image != NO_WATERMARK) {
                        $watermark_image = getWatermarkPath($watermark_image);
                        if (!file_exists($watermark_image)) {
                            $watermark_image = SERVERPATH . '/' . ZENFOLDER . '/images/imageDefault.png';
                        }
                    }
                }
            }
        }
        if ($watermark_image) {
            $offset_h = getOption('watermark_h_offset') / 100;
            $offset_w = getOption('watermark_w_offset') / 100;
            $watermark = zp_imageGet($watermark_image);
            $watermark_width = zp_imageWidth($watermark);
            $watermark_height = zp_imageHeight($watermark);
            $imw = zp_imageWidth($newim);
            $imh = zp_imageHeight($newim);
            $nw = sqrt($imw * $imh * $percent * ($watermark_width / $watermark_height));
            $nh = $nw * ($watermark_height / $watermark_width);
            $percent = getOption('watermark_scale') / 100;
            $r = sqrt($imw * $imh * $percent / ($watermark_width * $watermark_height));
            if (!getOption('watermark_allow_upscale')) {
                $r = min(1, $r);
            }
            $nw = round($watermark_width * $r);
            $nh = round($watermark_height * $r);
            if ($nw != $watermark_width || $nh != $watermark_height) {
                $watermark = zp_imageResizeAlpha($watermark, $nw, $nh);
            }
            // Position Overlay in Bottom Right
            $dest_x = max(0, floor(($imw - $nw) * $offset_w));
            $dest_y = max(0, floor(($imh - $nh) * $offset_h));
            if (DEBUG_IMAGE) {
                debugLog("Watermark:" . basename($imgfile) . ": \$offset_h={$offset_h}, \$offset_w={$offset_w}, \$watermark_height={$watermark_height}, \$watermark_width={$watermark_width}, \$imw={$imw}, \$imh={$imh}, \$percent={$percent}, \$r={$r}, \$nw={$nw}, \$nh={$nh}, \$dest_x={$dest_x}, \$dest_y={$dest_y}");
            }
            zp_copyCanvas($newim, $watermark, $dest_x, $dest_y, 0, 0, $nw, $nh);
            zp_imageKill($watermark);
        }
        // Create the cached file (with lots of compatibility)...
        mkdir_recursive(dirname($newfile));
        if (zp_imageOutput($newim, getSuffix($newfile), $newfile, $quality)) {
            //	successful save of cached image
            if (getOption('ImbedIPTC') && getSuffix($newfilename) == 'jpg') {
                // the imbed function works only with JPEG images
                $iptc_data = zp_imageIPTC($imgfile);
                if (empty($iptc_data)) {
                    global $_zp_extra_filetypes;
                    //	because we are doing the require in a function!
                    if (!$_zp_extra_filetypes) {
                        $_zp_extra_filetypes = array();
                    }
                    require_once dirname(__FILE__) . '/functions.php';
                    //	it is ok to increase memory footprint now since the image processing is complete
                    $gallery = new Gallery();
                    $iptc = array('1#090' => chr(0x1b) . chr(0x25) . chr(0x47), '2#115' => $gallery->getTitle());
                    $imgfile = str_replace(ALBUM_FOLDER_SERVERPATH, '', $imgfile);
                    $imagename = basename($imgfile);
                    $albumname = dirname($imgfile);
                    $image = newImage(new Album(new Gallery(), $albumname), $imagename);
                    $copyright = $image->getCopyright();
                    if (empty($copyright)) {
                        $copyright = getOption('default_copyright');
                    }
                    if (!empty($copyright)) {
                        $iptc['2#116'] = $copyright;
                    }
                    $credit = $image->getCredit();
                    if (!empty($credit)) {
                        $iptc['2#110'] = $credit;
                    }
                    foreach ($iptc as $tag => $string) {
                        $tag_parts = explode('#', $tag);
                        $iptc_data .= iptc_make_tag($tag_parts[0], $tag_parts[1], $string);
                    }
                } else {
                    if (GRAPHICS_LIBRARY == 'Imagick' && IMAGICK_RETAIN_PROFILES) {
                        //	Imageick has preserved the metadata
                        $iptc_data = false;
                    }
                }
                if ($iptc_data) {
                    $content = iptcembed($iptc_data, $newfile);
                    $fw = fopen($newfile, 'w');
                    fwrite($fw, $content);
                    fclose($fw);
                    clearstatcache();
                }
            }
            if (DEBUG_IMAGE) {
                debugLog('Finished:' . basename($imgfile));
            }
        } else {
            if (DEBUG_IMAGE) {
                debugLog('cacheImage: failed to create ' . $newfile);
            }
        }
        @chmod($newfile, 0666 & CHMOD_VALUE);
        zp_imageKill($newim);
        zp_imageKill($im);
    }
}
Example #11
0
 function write()
 {
     //        echo 'Writing file...<br />';
     if (!function_exists('iptcembed')) {
         return false;
     }
     $mode = 0;
     //        var_dump($this->binary());
     //        var_dump($this->path);
     $content = iptcembed($this->binary(), $this->path, $mode);
     $filename = $this->file;
     @unlink($filename);
     #delete if exists
     $fp = fopen($filename, "w");
     fwrite($fp, $content);
     fclose($fp);
 }
Example #12
0
 /**
  * Embed IPTC data block and output to standard output
  *
  * @access public
  */
 function output()
 {
     $sIPTCBlock = $this->_getIPTCBlock();
     @iptcembed($sIPTCBlock, $this->_sFilename, 2);
 }
Example #13
0
<?php

$jpg = base64_encode(file_get_contents(__DIR__ . "/iptc-data.jpg"));
$s = iptcembed("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "data://text/plain;base64," . $jpg);
var_dump(strlen($s));
Example #14
0
 function write()
 {
     $data = iptcembed($this->getBinary(), $this->_filename);
     $fp = fopen($this->_filename, 'wb');
     fwrite($fp, $data);
     fclose($fp);
 }
Example #15
0
 public function write()
 {
     $mode = 0;
     $content = iptcembed($this->binary(), $this->_file, $mode);
     $filename = $this->_file;
     @unlink($filename);
     #delete if exists
     $fp = fopen($filename, "w");
     fwrite($fp, $content);
     fclose($fp);
 }
 public function writeIptcIntoFile($targetFilename, $iptcRaw)
 {
     $content = iptcembed($this->iptcPrepareData($iptcRaw), $targetFilename);
     if ($content !== false) {
         $dest = $targetFilename . '.tmp';
         if (strlen($content) == @file_put_contents($dest, $content, LOCK_EX)) {
             // on success we replace the file
             unlink($targetFilename);
             rename($dest, $targetFilename);
         } else {
             // it was created a temp diskfile but not with all data in it
             if (file_exists($dest)) {
                 @unlink($dest);
                 return false;
             }
         }
     }
     return true;
 }
Example #17
0
 function force_download()
 {
     //$ori_path = "../pdfs/";
     //$book = "cubaan";
     //$ori  = $ori_path.'ori/'.$book.'.pdf';
     //$cover_ori  = $ori_path.'covers/'.$book.'.jpg';
     if ($this->pdf == '') {
         echo 'Please set pdf path as in $this->pdfest->set_pdf_path("path/to/file.pdf")';
         exit;
     }
     if ($this->cover == '') {
         echo 'Please set cover path as in $this->pdfest->set_cover_path("path/to/cover.jpg")';
         exit;
     }
     if ($this->email == '') {
         echo 'Please set owner email as in $this->pdfest->set_owner_email("*****@*****.**")';
         exit;
     }
     if ($this->hp == '') {
         echo 'Please set owner hp as in $this->pdfest->set_owner_hp("012345678")';
         exit;
     }
     $ori = $this->pdf;
     $cover_ori = $this->cover;
     $pat = explode('/', $cover_ori);
     $cov = $this->hp . '-' . $pat[count($pat) - 1];
     $pat[count($pat) - 1] = $cov;
     //var_dump($cov);
     $cover_path = implode('/', $pat);
     //var_dump($cover_path);
     $email = $this->email;
     $hp = $this->hp;
     $hash = sha1($email . $hp);
     //$cover_path = $ori_path.'temp/'.$hp.'.'.$book.'.jpg';
     // Path to jpeg file
     $path = $cover_ori;
     // We need to check if theres any IPTC data in the jpeg image. If there is then
     // bail out because we cannot embed any image that already has some IPTC data!
     $image = getimagesize($path, $info);
     if (isset($info['APP13'])) {
         die('Error: IPTC data found in source image, cannot continue');
     }
     // Set the IPTC tags
     $iptc = array('2#120' => 'Cover For ' . $this->title, '2#116' => 'Copyright 2012, PTS Akademia (' . md5($email . '/' . $hp) . ')');
     // Convert the IPTC tags into binary code
     $data = '';
     foreach ($iptc as $tag => $string) {
         $tag = substr($tag, 2);
         $data .= $this->iptc_make_tag(2, $tag, $string);
     }
     // Embed the IPTC data
     $content = iptcembed($data, $path);
     // Write the new image data out to the file.
     $fp = fopen($cover_path, "wb");
     fwrite($fp, $content);
     fclose($fp);
     /*****************
     				Siap Cover
     				///buat PDF
     			******************/
     $pagecount = $this->setSourceFile($ori);
     $this->SetTitle($this->title);
     //$this->SetAuthor('Izwan Wahab');
     $this->SetCreator('PTS Akademia');
     //$this->SetSubject('Subjek atau Kategori Buku Ini');
     $this->SetKeywords($hash);
     //add coverpage
     $this->addPage();
     $this->Image($cover_path, 0, 0, 150);
     for ($n = 1; $n <= $pagecount; $n++) {
         $tplidx = $this->ImportPage($n);
         //
         $this->addPage();
         $this->useTemplate($tplidx);
     }
     //$this->SetTopMargin(400);
     if ($this->pass != null) {
         $this->SetProtection(array(), $this->pass, $this->owner_pass);
     } else {
         $this->SetProtection(array(), NULL, $this->owner_pass);
     }
     //tak kasi print
     $this->Output($this->title . '-' . $hp . '-' . date('d.m.Y.H.i.s') . '.pdf', 'D');
 }
Example #18
0
 /**
  * Resize the image proportionally to the given width/height
  *
  * Note: Some code used in this method is adapted from code found in comments at php.net for the GD functions
  *
  * @param int $targetWidth Target width in pixels, or 0 for proportional to height
  * @param int $targetHeight Target height in pixels, or 0 for proportional to width. Optional-if not specified, 0 is assumed.
  * @return bool True if the resize was successful
  * @throws WireException when not enough memory to load image
  *
  */
 public function ___resize($targetWidth, $targetHeight = 0)
 {
     if ($this->scale !== 1.0) {
         // adjust for hidpi
         if ($targetWidth) {
             $targetWidth = ceil($targetWidth * $this->scale);
         }
         if ($targetHeight) {
             $targetHeight = ceil($targetHeight * $this->scale);
         }
     }
     $orientations = null;
     // @horst
     $needRotation = $this->autoRotation !== true ? false : ($this->checkOrientation($orientations) && (!empty($orientations[0]) || !empty($orientations[1])) ? true : false);
     $source = $this->filename;
     $dest = str_replace("." . $this->extension, "_tmp." . $this->extension, $source);
     $image = null;
     // check if we can load the sourceimage into ram
     if (self::checkMemoryForImage(array($this->info[0], $this->info[1], $this->info['channels'])) === false) {
         throw new WireException(basename($source) . " - not enough memory to load");
     }
     switch ($this->imageType) {
         // @teppo
         case IMAGETYPE_GIF:
             $image = @imagecreatefromgif($source);
             break;
         case IMAGETYPE_PNG:
             $image = @imagecreatefrompng($source);
             break;
         case IMAGETYPE_JPEG:
             $image = @imagecreatefromjpeg($source);
             break;
     }
     if (!$image) {
         return false;
     }
     if ($this->imageType != IMAGETYPE_PNG || !$this->hasAlphaChannel()) {
         // @horst: linearize gamma to 1.0 - we do not use gamma correction with pngs containing alphachannel, because GD-lib  doesn't respect transparency here (is buggy)
         $this->gammaCorrection($image, true);
     }
     if ($this->rotate || $needRotation) {
         // @horst
         $degrees = $this->rotate ? $this->rotate : $orientations[0];
         $image = $this->imRotate($image, $degrees);
         if (abs($degrees) == 90 || abs($degrees) == 270) {
             // we have to swap width & height now!
             $tmp = array($this->getWidth(), $this->getHeight());
             $this->setImageInfo($tmp[1], $tmp[0]);
         }
     }
     if ($this->flip || $needRotation) {
         $vertical = null;
         if ($this->flip) {
             $vertical = $this->flip == 'v';
         } else {
             if ($orientations[1] > 0) {
                 $vertical = $orientations[1] == 2;
             }
         }
         if (!is_null($vertical)) {
             $image = $this->imFlip($image, $vertical);
         }
     }
     // if there is requested to crop _before_ resize, we do it here @horst
     if (is_array($this->cropExtra)) {
         // check if we can load a second copy from sourceimage into ram
         if (self::checkMemoryForImage(array($this->info[0], $this->info[1], 3)) === false) {
             throw new WireException(basename($source) . " - not enough memory to load a copy for cropExtra");
         }
         $imageTemp = imagecreatetruecolor(imagesx($image), imagesy($image));
         // create an intermediate memory image
         $this->prepareImageLayer($imageTemp, $image);
         imagecopy($imageTemp, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
         // copy our initial image into the intermediate one
         imagedestroy($image);
         // release the initial image
         // get crop values and create a new initial image
         list($x, $y, $w, $h) = $this->cropExtra;
         // check if we can load a cropped version into ram
         if (self::checkMemoryForImage(array($w, $h, 3)) === false) {
             throw new WireException(basename($source) . " - not enough memory to load a cropped version for cropExtra");
         }
         $image = imagecreatetruecolor($w, $h);
         $this->prepareImageLayer($image, $imageTemp);
         imagecopy($image, $imageTemp, 0, 0, $x, $y, $w, $h);
         unset($x, $y, $w, $h);
         // now release the intermediate image and update settings
         imagedestroy($imageTemp);
         $this->setImageInfo(imagesx($image), imagesy($image));
         // $this->cropping = false; // ?? set this to prevent overhead with the following manipulation ??
     }
     // here we check for cropping, upscaling, sharpening
     // we get all dimensions at first, before any image operation !
     list($gdWidth, $gdHeight, $targetWidth, $targetHeight) = $this->getResizeDimensions($targetWidth, $targetHeight);
     $x1 = $gdWidth / 2 - $targetWidth / 2;
     $y1 = $gdHeight / 2 - $targetHeight / 2;
     $this->getCropDimensions($x1, $y1, $gdWidth, $targetWidth, $gdHeight, $targetHeight);
     // now lets check what operations are necessary:
     if ($gdWidth == $targetWidth && $gdWidth == $this->image['width'] && $gdHeight == $this->image['height'] && $gdHeight == $targetHeight) {
         // this is the case if the original size is requested or a greater size but upscaling is set to false
         // since we have added support for crop-before-resize, we have to check for this
         if (!is_array($this->cropExtra)) {
             // the sourceimage is allready the targetimage, we can leave here
             @imagedestroy($image);
             return true;
         }
         // we have a cropped_before_resized image and need to save this version,
         // so we let pass it through without further manipulation, we just need to copy it into the final memimage called "$thumb"
         if (self::checkMemoryForImage(array(imagesx($image), imagesy($image), 3)) === false) {
             throw new WireException(basename($source) . " - not enough memory to copy the final cropExtra");
         }
         $thumb = imagecreatetruecolor(imagesx($image), imagesy($image));
         // create the final memory image
         $this->prepareImageLayer($thumb, $image);
         imagecopy($thumb, $image, 0, 0, 0, 0, imagesx($image), imagesy($image));
         // copy our intermediate image into the final one
     } else {
         if ($gdWidth == $targetWidth && $gdHeight == $targetHeight) {
             // this is the case if we scale up or down _without_ cropping
             if (self::checkMemoryForImage(array($gdWidth, $gdHeight, 3)) === false) {
                 throw new WireException(basename($source) . " - not enough memory to resize to the final image");
             }
             $thumb = imagecreatetruecolor($gdWidth, $gdHeight);
             $this->prepareImageLayer($thumb, $image);
             imagecopyresampled($thumb, $image, 0, 0, 0, 0, $gdWidth, $gdHeight, $this->image['width'], $this->image['height']);
         } else {
             // we have to scale up or down and to _crop_
             if (self::checkMemoryForImage(array($gdWidth, $gdHeight, 3)) === false) {
                 throw new WireException(basename($source) . " - not enough memory to resize to the intermediate image");
             }
             $thumb2 = imagecreatetruecolor($gdWidth, $gdHeight);
             $this->prepareImageLayer($thumb2, $image);
             imagecopyresampled($thumb2, $image, 0, 0, 0, 0, $gdWidth, $gdHeight, $this->image['width'], $this->image['height']);
             if (self::checkMemoryForImage(array($targetWidth, $targetHeight, 3)) === false) {
                 throw new WireException(basename($source) . " - not enough memory to crop to the final image");
             }
             $thumb = imagecreatetruecolor($targetWidth, $targetHeight);
             $this->prepareImageLayer($thumb, $image);
             imagecopyresampled($thumb, $thumb2, 0, 0, $x1, $y1, $targetWidth, $targetHeight, $targetWidth, $targetHeight);
             imagedestroy($thumb2);
         }
     }
     // optionally apply sharpening to the final thumb
     if ($this->sharpening && $this->sharpening != 'none') {
         // @horst
         if (IMAGETYPE_PNG != $this->imageType || !$this->hasAlphaChannel()) {
             // is needed for the USM sharpening function to calculate the best sharpening params
             $this->usmValue = $this->calculateUSMfactor($targetWidth, $targetHeight);
             $thumb = $this->imSharpen($thumb, $this->sharpening);
         }
     }
     // write to file
     $result = false;
     switch ($this->imageType) {
         case IMAGETYPE_GIF:
             // correct gamma from linearized 1.0 back to 2.0
             $this->gammaCorrection($thumb, false);
             $result = imagegif($thumb, $dest);
             break;
         case IMAGETYPE_PNG:
             if (!$this->hasAlphaChannel()) {
                 $this->gammaCorrection($thumb, false);
             }
             // always use highest compression level for PNG (9) per @horst
             $result = imagepng($thumb, $dest, 9);
             break;
         case IMAGETYPE_JPEG:
             // correct gamma from linearized 1.0 back to 2.0
             $this->gammaCorrection($thumb, false);
             $result = imagejpeg($thumb, $dest, $this->quality);
             break;
     }
     if (isset($image) && is_resource($image)) {
         @imagedestroy($image);
     }
     // @horst
     if (isset($thumb) && is_resource($thumb)) {
         @imagedestroy($thumb);
     }
     if (isset($thumb2) && is_resource($thumb2)) {
         @imagedestroy($thumb2);
     }
     if (isset($image)) {
         $image = null;
     }
     if (isset($thumb)) {
         $thumb = null;
     }
     if (isset($thumb2)) {
         $thumb2 = null;
     }
     if ($result === false) {
         if (is_file($dest)) {
             @unlink($dest);
         }
         return false;
     }
     unlink($source);
     // $source is equal to $this->filename
     rename($dest, $source);
     // $dest is the intermediate filename ({basename}_tmp{.ext})
     // @horst: if we've retrieved IPTC-Metadata from sourcefile, we write it back now
     if ($this->iptcRaw) {
         $content = iptcembed($this->iptcPrepareData(), $this->filename);
         if ($content !== false) {
             $dest = preg_replace('/\\.' . $this->extension . '$/', '_tmp.' . $this->extension, $this->filename);
             if (strlen($content) == @file_put_contents($dest, $content, LOCK_EX)) {
                 // on success we replace the file
                 unlink($this->filename);
                 rename($dest, $this->filename);
             } else {
                 // it was created a temp diskfile but not with all data in it
                 if (file_exists($dest)) {
                     @unlink($dest);
                 }
             }
         }
     }
     $this->loadImageInfo($this->filename, true);
     $this->modified = true;
     return true;
 }
Example #19
0
 /**
  * create the new image file already 
  * with the new "IPTC" recorded
  *
  * @access public
  * @return boolean
  */
 public function write()
 {
     //@see http://php.net/manual/pt_BR/function.iptcembed.php
     $content = iptcembed($this->binary(), $this->_filename, 0);
     if ($content === false) {
         throw new Iptc_Exception('Failed to save IPTC data into file');
     }
     @unlink($this->_filename);
     return file_put_contents($this->_filename, $content) !== false;
 }
Example #20
0
/**
 * Creates the cache folder version of the image, including watermarking
 *
 * @param string $newfilename the name of the file when it is in the cache
 * @param string $imgfile the image name
 * @param array $args the cropping arguments
 * @param bool $allow_watermark set to true if image may be watermarked
 * @param string $theme the current theme
 * @param string $album the album containing the image
 */
function cacheImage($newfilename, $imgfile, $args, $allow_watermark = false, $theme, $album)
{
    global $_zp_gallery;
    try {
        @(list($size, $width, $height, $cw, $ch, $cx, $cy, $quality, $thumb, $crop, $thumbstandin, $passedWM, $adminrequest, $effects) = $args);
        // Set the config variables for convenience.
        $image_use_side = getOption('image_use_side');
        $upscale = getOption('image_allow_upscale');
        $allowscale = true;
        $sharpenthumbs = getOption('thumb_sharpen');
        $sharpenimages = getOption('image_sharpen');
        $id = $im = NULL;
        $watermark_use_image = getAlbumInherited($album, 'watermark', $id);
        if (empty($watermark_use_image)) {
            $watermark_use_image = IMAGE_WATERMARK;
        }
        if (!$effects) {
            if ($thumb && getOption('thumb_gray')) {
                $effects = 'gray';
            } else {
                if (getOption('image_gray')) {
                    $effects = 'gray';
                }
            }
        }
        $newfile = SERVERCACHE . $newfilename;
        mkdir_recursive(dirname($newfile), FOLDER_MOD);
        if (DEBUG_IMAGE) {
            debugLog("cacheImage(\$imgfile=" . basename($imgfile) . ", \$newfilename={$newfilename}, \$allow_watermark={$allow_watermark}, \$theme={$theme}) \$size={$size}, \$width={$width}, \$height={$height}, \$cw={$cw}, \$ch={$ch}, \$cx=" . (is_null($cx) ? 'NULL' : $cx) . ", \$cy=" . (is_null($cy) ? 'NULL' : $cy) . ", \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop} \$image_use_side={$image_use_side}; \$upscale={$upscale});");
        }
        // Check for the source image.
        if (!file_exists($imgfile) || !is_readable($imgfile)) {
            imageError('404 Not Found', sprintf(gettext('Image %s not found or is unreadable.'), filesystemToInternal($imgfile)), 'err-imagenotfound.png');
        }
        $rotate = false;
        if (zp_imageCanRotate()) {
            $rotate = getImageRotation($imgfile);
        }
        $s = getSuffix($imgfile);
        if (function_exists('exif_thumbnail') && getOption('use_embedded_thumb') && ($s == 'jpg' || $s == 'jpeg')) {
            $im = exif_thumbnail($imgfile, $tw, $th, $tt);
            if ($im) {
                if ($size) {
                    $big_enough = $tw >= $size && $th >= $size;
                } else {
                    $big_enough = $tw >= $width && $th >= $height;
                }
                if ($big_enough) {
                    $im = zp_imageFromString($im);
                    if (DEBUG_IMAGE && $im) {
                        debugLog(sprintf(gettext('Using %1$ux%2$u %3$s thumbnail image.'), $tw, $th, image_type_to_mime_type($tt)));
                    }
                } else {
                    $im = false;
                }
            } else {
                $im = false;
            }
        }
        if (!$im) {
            $im = zp_imageGet($imgfile);
        }
        if (!$im) {
            imageError('404 Not Found', sprintf(gettext('Image %s not renderable (imageGet).'), filesystemToInternal($imgfile)), 'err-failimage.png');
        }
        if ($rotate) {
            if (DEBUG_IMAGE) {
                debugLog("cacheImage:rotate->{$rotate}");
            }
            $im = zp_rotateImage($im, $rotate);
            if (!$im) {
                imageError('404 Not Found', sprintf(gettext('Image %s not rotatable.'), filesystemToInternal($imgfile)), 'err-failimage.png');
            }
        }
        $w = zp_imageWidth($im);
        $h = zp_imageHeight($im);
        // Give the sizing dimension to $dim
        $ratio_in = '';
        $ratio_out = '';
        $crop = $crop || $cw != 0 || $ch != 0;
        if (!empty($size)) {
            $dim = $size;
            if ($crop) {
                $dim = $size;
                if (!$ch) {
                    $ch = $size;
                }
                if (!$cw) {
                    $cw = $size;
                }
                $width = $cw;
                $height = $ch;
                $size = false;
            } else {
                $width = $height = false;
            }
        } else {
            if (!empty($width) && !empty($height)) {
                $ratio_in = $h / $w;
                $ratio_out = $height / $width;
                if ($ratio_in > $ratio_out) {
                    // image is taller than desired, $height is the determining factor
                    $thumb = true;
                    $dim = $width;
                    if (!$ch) {
                        $ch = $height;
                    }
                } else {
                    // image is wider than desired, $width is the determining factor
                    $dim = $height;
                    if (!$cw) {
                        $cw = $width;
                    }
                }
            } else {
                if (!empty($width)) {
                    $dim = $width;
                    $size = $height = false;
                } else {
                    if (!empty($height)) {
                        $dim = $height;
                        $size = $width = false;
                    } else {
                        // There's a problem up there somewhere...
                        imageError('404 Not Found', sprintf(gettext('Unknown error processing %s! Please report to the <a href="' . GITHUB . '/issues">developers</a>'), filesystemToInternal($imgfile)), 'err-imagegeneral.png');
                    }
                }
            }
        }
        $sizes = propSizes($size, $width, $height, $w, $h, $thumb, $image_use_side, $dim);
        list($neww, $newh) = $sizes;
        if (DEBUG_IMAGE) {
            debugLog("cacheImage:" . basename($imgfile) . ": \$size={$size}, \$width={$width}, \$height={$height}, \$w={$w}; \$h={$h}; \$cw={$cw}, " . "\$ch={$ch}, \$cx={$cx}, \$cy={$cy}, \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop}, \$newh={$newh}, \$neww={$neww}, \$dim={$dim}, " . "\$ratio_in={$ratio_in}, \$ratio_out={$ratio_out} \$upscale={$upscale} \$rotate={$rotate} \$effects={$effects}");
        }
        if (!$upscale && $newh >= $h && $neww >= $w) {
            // image is the same size or smaller than the request
            $neww = $w;
            $newh = $h;
            $allowscale = false;
            if ($crop) {
                if ($width > $neww) {
                    $width = $neww;
                }
                if ($height > $newh) {
                    $height = $newh;
                }
            }
            if (DEBUG_IMAGE) {
                debugLog("cacheImage:no upscale " . basename($imgfile) . ":  \$newh={$newh}, \$neww={$neww}, \$crop={$crop}, \$thumb={$thumb}, \$rotate={$rotate}, watermark=" . $watermark_use_image);
            }
        }
        $watermark_image = false;
        if ($passedWM) {
            if ($passedWM != NO_WATERMARK) {
                $watermark_image = getWatermarkPath($passedWM);
                if (!file_exists($watermark_image)) {
                    $watermark_image = SERVERPATH . '/' . ZENFOLDER . '/images/imageDefault.png';
                }
            }
        } else {
            if ($allow_watermark) {
                $watermark_image = $watermark_use_image;
                if ($watermark_image) {
                    if ($watermark_image != NO_WATERMARK) {
                        $watermark_image = getWatermarkPath($watermark_image);
                        if (!file_exists($watermark_image)) {
                            $watermark_image = SERVERPATH . '/' . ZENFOLDER . '/images/imageDefault.png';
                        }
                    }
                }
            }
        }
        // Crop the image if requested.
        if ($crop) {
            if ($cw > $ch) {
                $ir = $ch / $cw;
            } else {
                $ir = $cw / $ch;
            }
            if ($size) {
                $neww = $size;
                $newh = $ir * $size;
            } else {
                $neww = $width;
                $newh = $height;
                if ($neww > $newh) {
                    if ($newh === false) {
                        $newh = $ir * $neww;
                    }
                } else {
                    if ($neww === false) {
                        $neww = $ir * $newh;
                    }
                }
            }
            if (is_null($cx) && is_null($cy)) {
                // scale crop to max of image
                // set crop scale factor
                $cf = 1;
                if ($cw) {
                    $cf = min($cf, $cw / $neww);
                }
                if ($ch) {
                    $cf = min($cf, $ch / $newh);
                }
                //	set the image area of the crop (use the most image possible, rule of thirds positioning)
                if (!$cw || $w / $cw * $ch > $h) {
                    $cw = round($h / $ch * $cw * $cf);
                    $ch = round($h * $cf);
                    $cx = round(($w - $cw) / 3);
                } else {
                    $ch = round($w / $cw * $ch * $cf);
                    $cw = round($w * $cf);
                    $cy = round(($h - $ch) / 3);
                }
            } else {
                // custom crop
                if (!$cw || $cw > $w) {
                    $cw = $w;
                }
                if (!$ch || $ch > $h) {
                    $ch = $h;
                }
            }
            // force the crop to be within the image
            if ($cw + $cx > $w) {
                $cx = $w - $cw;
            }
            if ($cx < 0) {
                $cw = $cw + $cx;
                $cx = 0;
            }
            if ($ch + $cy > $h) {
                $cy = $h - $ch;
            }
            if ($cy < 0) {
                $ch = $ch + $cy;
                $cy = 0;
            }
            if (DEBUG_IMAGE) {
                debugLog("cacheImage:crop " . basename($imgfile) . ":\$size={$size}, \$width={$width}, \$height={$height}, \$cw={$cw}, \$ch={$ch}, \$cx={$cx}, \$cy={$cy}, \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop}, \$rotate={$rotate}");
            }
            $newim = zp_createImage($neww, $newh);
            if (!zp_resampleImage($newim, $im, 0, 0, $cx, $cy, $neww, $newh, $cw, $ch)) {
                imageError('404 Not Found', sprintf(gettext('Image %s not renderable (resample).'), filesystemToInternal($imgfile)), 'err-failimage.png');
            }
        } else {
            if ($newh >= $h && $neww >= $w && !$rotate && !$effects && !$watermark_image && (!$upscale || $newh == $h && $neww == $w)) {
                // we can just use the original!
                if (SYMLINK && @symlink($imgfile, $newfile)) {
                    if (DEBUG_IMAGE) {
                        debugLog("cacheImage:symlink original " . basename($imgfile) . ":\$size={$size}, \$width={$width}, \$height={$height}, \$dim={$dim}, \$neww={$neww}; \$newh={$newh}; \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop}, \$rotate={$rotate}; \$allowscale={$allowscale};");
                    }
                    clearstatcache();
                    return true;
                } else {
                    if (@copy($imgfile, $newfile)) {
                        if (DEBUG_IMAGE) {
                            debugLog("cacheImage:copy original " . basename($imgfile) . ":\$size={$size}, \$width={$width}, \$height={$height}, \$dim={$dim}, \$neww={$neww}; \$newh={$newh}; \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop}, \$rotate={$rotate}; \$allowscale={$allowscale};");
                        }
                        clearstatcache();
                        return true;
                    }
                }
            }
            if ($allowscale) {
                $sizes = propSizes($size, $width, $height, $w, $h, $thumb, $image_use_side, $dim);
                list($neww, $newh) = $sizes;
            }
            if (DEBUG_IMAGE) {
                debugLog("cacheImage:no crop " . basename($imgfile) . ":\$size={$size}, \$width={$width}, \$height={$height}, \$dim={$dim}, \$neww={$neww}; \$newh={$newh}; \$quality={$quality}, \$thumb={$thumb}, \$crop={$crop}, \$rotate={$rotate}; \$allowscale={$allowscale};");
            }
            $newim = zp_createImage($neww, $newh);
            if (!zp_resampleImage($newim, $im, 0, 0, 0, 0, $neww, $newh, $w, $h)) {
                imageError('404 Not Found', sprintf(gettext('Image %s not renderable (resample).'), filesystemToInternal($imgfile)), 'err-failimage.png');
            }
            if ($thumb && $sharpenthumbs || !$thumb && $sharpenimages) {
                if (!zp_imageUnsharpMask($newim, getOption('sharpen_amount'), getOption('sharpen_radius'), getOption('sharpen_threshold'))) {
                    imageError('404 Not Found', sprintf(gettext('Image %s not renderable (unsharp).'), filesystemToInternal($imgfile)), 'err-failimage.png');
                }
            }
        }
        $imgEffects = explode(',', $effects);
        if (in_array('gray', $imgEffects)) {
            zp_imageGray($newim);
        }
        if ($watermark_image) {
            $offset_h = getOption('watermark_h_offset') / 100;
            $offset_w = getOption('watermark_w_offset') / 100;
            $percent = getOption('watermark_scale') / 100;
            $watermark = zp_imageGet($watermark_image);
            if (!$watermark) {
                imageError('404 Not Found', sprintf(gettext('Watermark %s not renderable.'), $watermark_image), 'err-failimage.png');
            }
            $watermark_width = zp_imageWidth($watermark);
            $watermark_height = zp_imageHeight($watermark);
            $imw = zp_imageWidth($newim);
            $imh = zp_imageHeight($newim);
            $nw = sqrt($imw * $imh * $percent * ($watermark_width / $watermark_height));
            $nh = $nw * ($watermark_height / $watermark_width);
            $r = sqrt($imw * $imh * $percent / ($watermark_width * $watermark_height));
            if (!getOption('watermark_allow_upscale')) {
                $r = min(1, $r);
            }
            $nw = round($watermark_width * $r);
            $nh = round($watermark_height * $r);
            if ($nw != $watermark_width || $nh != $watermark_height) {
                $watermark = zp_imageResizeAlpha($watermark, $nw, $nh);
                if (!$watermark) {
                    imageError('404 Not Found', sprintf(gettext('Watermark %s not resizeable.'), $watermark_image), 'err-failimage.png');
                }
            }
            // Position Overlay in Bottom Right
            $dest_x = max(0, floor(($imw - $nw) * $offset_w));
            $dest_y = max(0, floor(($imh - $nh) * $offset_h));
            if (DEBUG_IMAGE) {
                debugLog("Watermark:" . basename($imgfile) . ": \$offset_h={$offset_h}, \$offset_w={$offset_w}, \$watermark_height={$watermark_height}, \$watermark_width={$watermark_width}, \$imw={$imw}, \$imh={$imh}, \$percent={$percent}, \$r={$r}, \$nw={$nw}, \$nh={$nh}, \$dest_x={$dest_x}, \$dest_y={$dest_y}");
            }
            if (!zp_copyCanvas($newim, $watermark, $dest_x, $dest_y, 0, 0, $nw, $nh)) {
                imageError('404 Not Found', sprintf(gettext('Image %s not renderable (copycanvas).'), filesystemToInternal($imgfile)), 'err-failimage.png');
            }
            zp_imageKill($watermark);
        }
        // Create the cached file (with lots of compatibility)...
        @chmod($newfile, 0777);
        if (zp_imageOutput($newim, getSuffix($newfile), $newfile, $quality)) {
            //	successful save of cached image
            if (getOption('ImbedIPTC') && getSuffix($newfilename) == 'jpg' && GRAPHICS_LIBRARY != 'Imagick') {
                // the imbed function works only with JPEG images
                global $_zp_images_classes;
                //	because we are doing the require in a function!
                require_once dirname(__FILE__) . '/functions.php';
                //	it is ok to increase memory footprint now since the image processing is complete
                $iptc = array('1#090' => chr(0x1b) . chr(0x25) . chr(0x47), '2#115' => $_zp_gallery->getTitle());
                $iptc_data = zp_imageIPTC($imgfile);
                if ($iptc_data) {
                    $iptc_data = iptcparse($iptc_data);
                    if ($iptc_data) {
                        $iptc = array_merge($iptc_data, $iptc);
                    }
                }
                $imgfile = str_replace(ALBUM_FOLDER_SERVERPATH, '', $imgfile);
                $imagename = basename($imgfile);
                $albumname = dirname($imgfile);
                $image = newImage(newAlbum($albumname), $imagename);
                $copyright = $image->getCopyright();
                if (empty($copyright)) {
                    $copyright = getOption('default_copyright');
                }
                if (!empty($copyright)) {
                    $iptc['2#116'] = $copyright;
                }
                $credit = $image->getCredit();
                if (!empty($credit)) {
                    $iptc['2#110'] = $credit;
                }
                $iptc_result = '';
                foreach ($iptc as $tag => $string) {
                    $tag_parts = explode('#', $tag);
                    if (is_array($string)) {
                        foreach ($string as $element) {
                            $iptc_result .= iptc_make_tag($tag_parts[0], $tag_parts[1], $element);
                        }
                    } else {
                        $iptc_result .= iptc_make_tag($tag_parts[0], $tag_parts[1], $string);
                    }
                }
                $content = iptcembed($iptc_result, $newfile);
                $fw = fopen($newfile, 'w');
                fwrite($fw, $content);
                fclose($fw);
                clearstatcache();
            }
            @chmod($newfile, FILE_MOD);
            if (DEBUG_IMAGE) {
                debugLog('Finished:' . basename($imgfile));
            }
        } else {
            if (DEBUG_IMAGE) {
                debugLog('cacheImage: failed to create ' . $newfile);
            }
            imageError('404 Not Found', sprintf(gettext('cacheImage: failed to create %s'), $newfile), 'err-failimage.png');
        }
        @chmod($newfile, FILE_MOD);
        zp_imageKill($newim);
        zp_imageKill($im);
    } catch (Exception $e) {
        debugLog('cacheImage(' . $newfilename . ') exception: ' . $e->getMessage());
        imageError('404 Not Found', sprintf(gettext('cacheImage(%1$s) exception: %2$s'), $newfilename, $e->getMessage()), 'err-failimage.png');
        return false;
    }
    clearstatcache();
    return true;
}
Example #21
0
 /**
  * Default IPTC Handling: if we've retrieved IPTC-Metadata from sourcefile, we write it into the variation here but we omit custom tags for internal use (@horst)
  *
  * @param bool $includeCustomTags, default is FALSE
  * @return bool
  *
  */
 public function writeBackIptc($includeCustomTags = false)
 {
     if (!$this->iptcRaw) {
         return;
     }
     $content = iptcembed($this->iptcPrepareData($includeCustomTags), $this->filename);
     if ($content === false) {
         return;
     }
     $dest = preg_replace('/\\.' . $this->extension . '$/', '_tmp.' . $this->extension, $this->filename);
     if (strlen($content) == @file_put_contents($dest, $content, LOCK_EX)) {
         // on success we replace the file
         unlink($this->filename);
         rename($dest, $this->filename);
         return true;
     } else {
         // it was created a temp diskfile but not with all data in it
         if (file_exists($dest)) {
             @unlink($dest);
         }
         return false;
     }
 }
Example #22
0
<?php

$file = dirname(__FILE__) . '/iptcembed_001.data';
$fp = fopen($file, "w");
fwrite($fp, "-1-1");
fclose($fp);
var_dump(iptcembed(-1, $file, -1));
unlink($file);
echo "Done\n";
Example #23
0
 private function writeIPTC($dat, $value)
 {
     # LIMIT TO JPG
     $caption_block = $this->iptc_maketag(2, $dat, $value);
     $image_string = iptcembed($caption_block, $this->fileName);
     file_put_contents('iptc.jpg', $image_string);
 }
 function fct_ecrireIPTC($tblIPTC_util, $cheminImgAModifier = "")
 {
     // La tableau devant contenir des IPTC est vide ou n'est pas un tableau associatif
     if (empty($tblIPTC_util) || !is_array($tblIPTC_util)) {
         return false;
     }
     // Si le chemin de l'image à modifier est vide alors on lui spécifie le chemin par défaut
     if (empty($cheminImgAModifier)) {
         $cheminImgAModifier = $this->h_cheminImg;
     }
     // On récupère l'IPTC du fichier image courant
     $tblIPTC_old = iptcparse($this->h_iptcData);
     // On prélève le tableau contenant les codes et les valeurs des IPTC de la photo
     while (list($codeIPTC, $codeLibIPTC) = each($this->h_codesIptc)) {
         // On teste si les données originelles correspondant au code en cours sont présents
         if (is_array($tblIPTC_old["2#" . $codeIPTC])) {
             $valIPTC_new = $tblIPTC_old["2#" . $codeIPTC];
         } else {
             $valIPTC_new = array();
         }
         // On remplace les valeurs des IPTC demandées
         if (is_array($tblIPTC_util[$codeIPTC])) {
             if (count($tblIPTC_util[$codeIPTC])) {
                 $valIPTC_new = $tblIPTC_util[$codeIPTC];
             }
         } else {
             $val = trim(strval($tblIPTC_util[$codeIPTC]));
             if (strlen($val)) {
                 $valIPTC_new[0] = $val;
             }
         }
         // On crée un nouveau iptcData à partir de '$tblIPTC_new' qui contient le code et la valeur de l'IPTC
         foreach ($valIPTC_new as $val) {
             $iptcData_new .= $this->fct_iptcMaketag(2, $codeIPTC, $val);
         }
     }
     /*    A partir du nouveau iptcData contenu dans '$iptcData_new' on crée grâce à la fonction 'iptcembed()'
           le contenu binaire du fichier image avec le nouveau IPTC inclu */
     $contenuImage = iptcembed($iptcData_new, $this->h_cheminImg);
     // Ecriture dans le fichier image
     $idFichier = fopen($cheminImgAModifier, "wb");
     fwrite($idFichier, $contenuImage);
     fclose($idFichier);
     return true;
 }