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); }
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); }
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); }
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); }
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); }
/** * 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; }
/** * 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); } }
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); }
/** * Embed IPTC data block and output to standard output * * @access public */ function output() { $sIPTCBlock = $this->_getIPTCBlock(); @iptcembed($sIPTCBlock, $this->_sFilename, 2); }
<?php $jpg = base64_encode(file_get_contents(__DIR__ . "/iptc-data.jpg")); $s = iptcembed("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "data://text/plain;base64," . $jpg); var_dump(strlen($s));
function write() { $data = iptcembed($this->getBinary(), $this->_filename); $fp = fopen($this->_filename, 'wb'); fwrite($fp, $data); fclose($fp); }
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; }
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'); }
/** * 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; }
/** * 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; }
/** * 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; }
/** * 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; } }
<?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";
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; }