public function createThali($dishArray = array(), $is_thali, $w = 140, $h = 0) { Configure::write('debug', 2); ini_set("max_execution_time", -1); $thali1 = new Imagick("tmpl/img/thali-1.png"); $thali2 = new Imagick("tmpl/img/thali-2.png"); $thali3 = new Imagick("tmpl/img/thali-3.png"); $mask_1 = new Imagick("tmpl/img/thali-mask2.png"); $mask_2 = new Imagick("tmpl/img/thali-mask3.png"); if (!is_array($dishArray)) { return false; } $mask_cnt = 0; foreach ($dishArray as $dish) { if ($mask_cnt > 1) { // Mask Locking (Modify if masks will be increased or decreased) break; } $dish = new Imagick($dish); $dish->scaleimage($thali1->getimagewidth(), $thali1->getimageheight()); // Set As per bowl image if ($is_thali) { if ($mask_cnt == 1) { $dish->rotateimage("#fff", 180); } $dish->compositeimage(new Imagick("tmpl/img/thali-mask" . ($mask_cnt + 2) . ".png"), \Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $dish->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $thali1->compositeimage($dish, \Imagick::COMPOSITE_ATOP, 0, 0, Imagick::CHANNEL_ALPHA); $thali1->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $thali2->compositeimage($dish, \Imagick::COMPOSITE_ATOP, 0, 0, Imagick::CHANNEL_ALPHA); $thali2->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $thali3->compositeimage($dish, \Imagick::COMPOSITE_ATOP, 0, 0, Imagick::CHANNEL_ALPHA); $thali3->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); } else { $thali3 = $dish; } $mask_cnt++; } $url = "files/thali_images/" . $this->randomString(6); $url_end = "-Thali.jpg"; $result_urls = array(); $thali1->setimageformat("jpg"); $thali1->setImageFileName($result_urls[] = $url . "-0" . $url_end); $thali1->scaleimage($w, $h); if ($is_thali) { $thali2->writeimage(); } $thali1->destroy(); $thali2->setimageformat("jpg"); $thali2->setImageFileName($result_urls[] = $url . "-1" . $url_end); $thali2->scaleimage($w, $h); if ($is_thali) { $thali2->writeimage(); } $thali2->destroy(); $thali3->setimageformat("jpg"); $thali3->setImageFileName($result_urls[] = $url . "-2" . $url_end); $thali3->scaleimage($w, $h); $thali3->writeimage(); $thali3->destroy(); return $result_urls; }
public function __construct(EntityManager $entityManager) { // Tag $this->add(array('name' => 'tag', 'required' => true, 'filters' => array(), 'validators' => array(array('name' => 'NotEmpty', 'break_chain_on_failure' => true, 'options' => array('messages' => array(\Zend\Validator\NotEmpty::IS_EMPTY => 'Please enter a Squad Tag')))))); // Name $this->add(array('name' => 'name', 'required' => true, 'filters' => array(), 'validators' => array(array('name' => 'NotEmpty', 'break_chain_on_failure' => true, 'options' => array('messages' => array(\Zend\Validator\NotEmpty::IS_EMPTY => 'Please enter a Squad Name')))))); // Homepage $this->add(array('name' => 'homepage', 'required' => false, 'filters' => array(), 'validators' => array(array('name' => 'Zend\\Validator\\Uri', 'break_chain_on_failure' => true, 'options' => array('allowRelative' => false, 'messages' => array(\Zend\Validator\Uri::INVALID => 'FRONTEND_SQUAD_URL_INVALID_FORMAT', \Zend\Validator\Uri::NOT_URI => 'FRONTEND_SQUAD_URL_INVALID_FORMAT')))))); // Title $this->add(array('name' => 'title', 'required' => false, 'filters' => array(), 'validators' => array())); // Email $this->add(array('name' => 'email', 'required' => false, 'filters' => array(), 'validators' => array(array('name' => 'Zend\\Validator\\EmailAddress', 'break_chain_on_failure' => true, 'options' => array('messages' => array(\Zend\Validator\EmailAddress::INVALID => 'FRONTEND_SQUAD_EMAIL_INVALID_FORMAT')))))); // DeleteLogo $this->add(array('name' => 'deleteLogo', 'required' => false, 'filters' => array(), 'validators' => array())); // Upload $this->add(array('name' => 'logo', 'required' => false, 'filters' => array(), 'validators' => array(array('name' => 'Zend\\Validator\\File\\Extension', 'break_chain_on_failure' => true, 'options' => array('extension' => array('jpg', 'jpeg', 'gif', 'png'), 'messages' => array(\Zend\Validator\File\Extension::FALSE_EXTENSION => 'Es werden folgende Logos unterstützt: png,jpg,jpeg,gif'))), array('name' => 'Callback', 'options' => array('message' => array(\Zend\Validator\Callback::INVALID_VALUE => 'FRONTEND_SQUAD_LOGO_INVALID_FORMAT'), 'callback' => function ($value) { if ($value['error'] != 0) { return false; } try { $image = new \Imagick($value['tmp_name']); if ($image->getimageheight() == $image->getimagewidth() && in_array($image->getimageheight(), array(16, 32, 64, 128, 256))) { return true; } else { return false; } } catch (\Exception $e) { return false; } return false; }))))); }
/** * @param $angle * @param bool $autoResize * @param string $color * @return Pimcore_Image_Adapter_Imagick */ public function rotate($angle) { $this->resource->rotateImage(new ImagickPixel('none'), $angle); $this->setWidth($this->resource->getimagewidth()); $this->setHeight($this->resource->getimageheight()); $this->reinitializeImage(); return $this; }
/** * * @param string $dishUrl * @param int $w Width of the Output Image * @param int $h Height of Output Image * @return string Path of genrated Image */ public function createBowl($dishUrl = null, $w = 140, $h = 0) { $bowl = new Imagick("tmpl/img/bowl.png"); $mask = new Imagick("tmpl/img/mask.png"); $dish = new Imagick($dishUrl); $dish->scaleimage($bowl->getimagewidth(), $bowl->getimageheight()); // Set As per bowl image $dish->compositeimage(new Imagick("tmpl/img/mask.png"), \Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $dish->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $bowl->compositeimage($dish, \Imagick::COMPOSITE_ATOP, 0, 0, Imagick::CHANNEL_ALPHA); $bowl->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $bowl->setimageformat("jpg"); $bowl->setImageFileName($url = "img_tmp/" . $this->randomString(10) . "-GE.jpg"); // $bowl->setinterlacescheme(\Imagick::INTERLACE_PNG); $bowl->scaleimage($w, $h); $bowl->writeimage(); $bowl->destroy(); return $url; }
function createBowl($dishUrl = null, $w = 140, $h = 0) { $du = explode("/", $dishUrl); $du = explode(".", $du[count($du) - 1]); $uri = $du[count($du) - 2]; $bowl = new Imagick("img/bowl.png"); $mask = new Imagick("img/mask.png"); $dish = new Imagick($dishUrl); $dish->scaleimage($bowl->getimagewidth(), $bowl->getimageheight()); // Set As per bowl image $dish->compositeimage(new Imagick("img/mask.png"), \Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $dish->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $bowl->compositeimage($dish, \Imagick::COMPOSITE_ATOP, 0, 0, Imagick::CHANNEL_ALPHA); $bowl->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $bowl->setimageformat("jpg"); $bowl->setImageFileName($url = "gen/" . $uri . ".jpg"); // $bowl->setinterlacescheme(\Imagick::INTERLACE_PNG); $bowl->scaleimage($w, $h); $bowl->writeimage(); $bowl->destroy(); return $url; }
/** * Resize image and save * @param string $sPathSrc Path to source image * @param string $sPathDst Path to output image * @param integer $iWidth Width of output image * @param integer $iHeight Height of output image * @param string $sMode Transformation mode * @param string $sImageForZoomPath Path for zoom thumbnail */ public static function resizeImage($sPathSrc, $sPathDst, $iWidth, $iHeight, $sMode = "out", $sImageForZoomPath = null) { if (empty($sPathDst)) { $sPathDst = $sPathSrc; } if ($sMode == 'noresize') { return AM_Tools_Standard::getInstance()->copy($sPathSrc, $sPathDst); } $oSrcImage = new Imagick($sPathSrc); $iSrcWidth = $oSrcImage->getimagewidth(); $iSrcHeight = $oSrcImage->getimageheight(); //For images with horizontal proportions in vertical issue if ($iSrcWidth > $iSrcHeight && $iWidth < $iHeight && $sMode == 'width') { $iTmpHeight = $iHeight; $iHeight = $iWidth; $iWidth = $iTmpHeight; } self::_resizeImage($sPathSrc, $sPathDst, $iWidth, $iHeight, $sMode); if (!is_null($sImageForZoomPath)) { self::_resizeImage($sPathSrc, $sImageForZoomPath, $iWidth * 2, $iHeight * 2, $sMode); } }
/** * @param $fileArray * @param bool $create_thumb * @param $destination // relative to app/public/files directory, no trailing slash * @return bool|string */ public function saveImage($fileArray, $create_thumb = false, $destination = false) { $tmp_file = $fileArray['tmp_name']; $name = $fileArray['name']; if (!$destination) { $dest = $this->dest; } else { $dest = $this->dest . DS . $destination; } $img = new \Imagick($tmp_file); $img_width = $img->getimagewidth(); $img_height = $img->getimageheight(); if ($this->_height == 'auto' && is_numeric($this->_width) && $img_width > $this->_width) { // resize only width $img->resizeimage($img_width, 0, \Imagick::FILTER_LANCZOS, 1); } elseif ($this->_width == 'auto' && is_numeric($this->_height) && $img_height > $this->_height) { $img->resizeimage(0, $img_height, \Imagick::FILTER_LANCZOS, 1); } elseif (is_numeric($this->_height) && is_numeric($this->_width)) { $img->resizeimage($img_width, $img_height, \Imagick::FILTER_LANCZOS, 1, 1); } #dpi $img->setImageUnits(\Imagick::RESOLUTION_PIXELSPERINCH); $img->setImageResolution($this->_dpi, $this->_dpi); #compression $img->setImageCompressionQuality($this->_compression); $name = substr(md5(microtime()), 0, 4) . $name; $name = str_replace(' ', '', $name); try { $img->writeimage($dest . DS . $name); } catch (\Exception $e) { return false; } if ($create_thumb) { $this->createThumb($tmp_file, $dest . DS . 'thumb_' . $name, $this->_thumb_width, $this->_thumb_height); } return $name; }
/** * @param $field * @param $max_width * @param $max_height * @return bool */ public function resize($field, $max_width, $max_height) { if (!class_exists('\\Imagick') || !isset($this->last_uploads[$field][2])) { return true; } $img_path = $this->last_uploads[$field][2]; $img = new \Imagick($img_path); $w = $img->getimagewidth(); $h = $img->getimageheight(); $nw = $w; $nh = $h; if ($w > $max_width) { $nw = $max_width; } if ($h > $max_height) { $nh = $max_height; } if ($nw != $w || $nh != $h) { $img->resizeImage($nw, $nh, \Imagick::FILTER_LANCZOS, 1); } else { return true; } return $img->writeimage($img_path) && $img->destroy(); }
private function genImgRunner($rugpngs, $colors = array(), $location = "files/temp/") { if (is_file($location . "runner.png")) { return $location; } ini_set("max_execution_time", -1); $layers = array(); $bg = null; foreach ($rugpngs as $rp) { if ($rp['type'] == "LAYER") { $layers[] = new Imagick($rp['path']); } else { $bg = new Imagick($rp['path']); } } if ($bg == NULL) { $bg = new Imagick(); $bg->newImage(910, 475, new ImagickPixel('none')); $bg->setimageformat('png'); } foreach ($layers as $layer) { //$layer->resizeImage(910, 475, Imagick::FILTER_LANCZOS, 1, TRUE); $layer->setimageformat("png"); } $bg->resizeImage($layer->getimagewidth(), $layer->getimageheight(), Imagick::FILTER_LANCZOS, 1, TRUE); $bg->setimageformat("png"); $cnt_a = 0; foreach ($layers as $layer) { $layer->paintopaqueimage(new ImagickPixel('#000'), $colors[$cnt_a], 900000); $bg->compositeimage($layer, \Imagick::COMPOSITE_MULTIPLY, 0, 0); $cnt_a++; $layer->destroy(); } $bg->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $bg = $this->getBgPresp($bg, 60); $rnd = new Imagick("files/templates/new/runner/angle.png"); $bg->scaleimage(0, $rnd->getimageheight()); $rnd->compositeimage($bg, \Imagick::COMPOSITE_MULTIPLY, 0, 0); $rnd->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $rnd->compositeimage(new Imagick("files/templates/new/runner/angle_trim.png"), \Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $rnd->setimageformat("png"); $rnd->setImageFileName($location . "runner.png"); $rnd->setinterlacescheme(\Imagick::INTERLACE_PNG); $rnd->scaleimage(733, 0); $rnd->writeimage(); $rnd->destroy(); $rnd = new Imagick("files/templates/new/runner/flip.png"); $bg->scaleimage(0, $rnd->getimageheight()); $rnd->compositeimage($bg, \Imagick::COMPOSITE_MULTIPLY, 0, 0); $rnd->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $rnd->compositeimage(new Imagick("files/templates/new/runner/flip_trim.png"), \Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $rnd->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $rnd->compositeimage(new Imagick("files/templates/new/runner/flip.png"), \Imagick::COMPOSITE_DSTOVER, 0, 0, Imagick::CHANNEL_ALPHA); $rnd->setimageformat("png"); $rnd->setImageFileName($location . "runner1.png"); $rnd->setinterlacescheme(\Imagick::INTERLACE_PNG); $rnd->scaleimage(733, 0); $rnd->writeimage(); $rnd->destroy(); $rnd = new Imagick("files/templates/new/runner/straight.png"); $bg->scaleimage($rnd->getimagewidth(), 0); $rnd->compositeimage($bg, \Imagick::COMPOSITE_MULTIPLY, 0, 0); $rnd->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $rnd->compositeimage(new Imagick("files/templates/new/runner/straight_trim.png"), \Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $rnd->setimageformat("png"); $rnd->setImageFileName($location . "runner2.png"); $rnd->setinterlacescheme(\Imagick::INTERLACE_PNG); $rnd->scaleimage(733, 0); $rnd->writeimage(); $rnd->destroy(); /* $rnd = new Imagick("files/templates/runner/runners-4.png"); $rnd->compositeimage($bg, \Imagick::COMPOSITE_MULTIPLY, 0, 200); $rnd->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $rnd->compositeimage(new Imagick("files/templates/runner/runners-4.png"), \Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $rnd->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $rnd->compositeimage(new Imagick("files/templates/runner/runners-5.png"), \Imagick::COMPOSITE_DEFAULT, 0, 0, Imagick::CHANNEL_ALPHA); $rnd->setimageformat("png"); $rnd->setImageFileName($location . "runner3.png"); $rnd->writeimage(); $rnd->destroy(); */ return $location; }
/** * Load actual image pixels from Imagick object * * @param Imagick $im Image to load from */ public function readImageFromImagick(Imagick $im) { /* Threshold */ $im->setImageType(Imagick::IMGTYPE_TRUECOLOR); // Remove transparency (good for PDF's) $max = $im->getQuantumRange(); $max = $max["quantumRangeLong"]; $im->thresholdImage(0.5 * $max); /* Make a string of 1's and 0's */ $geometry = $im->getimagegeometry(); $this->imgHeight = $im->getimageheight(); $this->imgWidth = $im->getimagewidth(); $this->imgData = str_repeat("", $this->imgHeight * $this->imgWidth); for ($y = 0; $y < $this->imgHeight; $y++) { for ($x = 0; $x < $this->imgWidth; $x++) { /* Faster to average channels, blend alpha and negate the image here than via filters (tested!) */ $cols = $im->getImagePixelColor($x, $y); $cols = $cols->getcolor(); $greyness = (int) (($cols['r'] + $cols['g'] + $cols['b']) / 3) >> 7; // 1 for white, 0 for black $this->imgData[$y * $this->imgWidth + $x] = 1 - $greyness; // 1 for black, 0 for white } } }
/** * * 获取图片信息 * @param unknown_type $img */ public function getImageInfo($img) { $image = new Imagick($img); $handle = $image->readimage($img); if (!$handle) { return false; } $width = $image->getimagewidth(); $height = $image->getimageheight(); $mime = $image->getimagemimetype(); $type = $image->getimageformat(); $size = $image->getimagesize(); $resolution = $image->getimageresolution(); $unit = $image->getimageunits(); $info = array('width' => $width, 'height' => $height, 'mime' => $mime, 'type' => $type, 'size' => $size, 'resolution' => $resolution, 'unit' => $unit); $image->destroy(); return $info; }
/** * Open a image and get informations * @param string $path to file image * @return array with image, width and height, or false */ private static function open($path) { // get file name $file_name = basename($path); if (Image::use_magic()) { logger::debug('imagick available'); $image = new Imagick($path); $image_information = array($image->getimagewidth(), $image->getimageheight()); } else { logger::debug('imagick NOT available'); // ensure this is a valid file if (!($image_information = Safe::GetImageSize($path))) { if ($verbose) { Logger::error(sprintf(i18n::s('No image information in %s.'), $file_name)); } return FALSE; } // GIF image if ($image_information[2] == 1 && is_callable('ImageCreateFromGIF')) { $image = ImageCreateFromGIF($path); } elseif ($image_information[2] == 2 && is_callable('ImageCreateFromJPEG')) { $image = ImageCreateFromJPEG($path); } elseif ($image_information[2] == 3 && is_callable('ImageCreateFromPNG')) { $image = ImageCreateFromPNG($path); } // sanity check if (!isset($image)) { if ($verbose) { Logger::error(sprintf(i18n::s('No GD support, or unknown image type in %s.'), $file_name)); } return FALSE; } } $info = array($image, $image_information); return $info; }
public function createThali($dishArray = array(), $w = 140, $h = 0) { Configure::write('debug', 2); ini_set("max_execution_time", -1); $thali = new Imagick("tmpl/img/thali.png"); $mask_1 = new Imagick("tmpl/img/thali-mask1.png"); $mask_2 = new Imagick("tmpl/img/thali-mask2.png"); $mask_3 = new Imagick("tmpl/img/thali-mask3.png"); $mask_4 = new Imagick("tmpl/img/thali-mask4.png"); $mask_5 = new Imagick("tmpl/img/thali-mask5.png"); if (!is_array($dishArray)) { return false; } $mask_cnt = 0; foreach ($dishArray as $dish) { if ($mask_cnt > 4) { // Mask Locking (Modify if masks will be increased or decreased) break; } $dish = new Imagick($dish); if ($mask_cnt + 1 == 5) { $dish = new Imagick("tmpl/dishes/rice.jpg"); // Fixed Rice for Mask No. 1 } $dish->scaleimage($thali->getimagewidth(), $thali->getimageheight()); // Set As per bowl image $dish->compositeimage(new Imagick("tmpl/img/thali-mask" . ($mask_cnt + 1) . ".png"), \Imagick::COMPOSITE_COPYOPACITY, 0, 0, Imagick::CHANNEL_ALPHA); $dish->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $thali->compositeimage($dish, \Imagick::COMPOSITE_ATOP, 0, 0, Imagick::CHANNEL_ALPHA); $thali->mergeimagelayers(Imagick::LAYERMETHOD_COALESCE); $mask_cnt++; } $thali->setimageformat("jpg"); $thali->setImageFileName($url = "files/thali_images/" . $this->randomString(6) . "-Thali.jpg"); // $thali->setinterlacescheme(\Imagick::INTERLACE_PNG); $thali->scaleimage($w, $h); $thali->writeimage(); $thali->destroy(); return $url; }
public function actiongoPhotoFB() { ignore_user_abort(1); set_time_limit(0); $urlPhoto = $_POST['urlPhoto']; $f = $_POST['filter']; $capPhoto = $_POST['capPhoto']; Helper::debugConsole("post ok"); $namePhoto = Helper::getLastPath($urlPhoto); $min_rand = rand(0, 1000); $max_rand = rand(100000000000, 10000000000000000); $name_file = rand($min_rand, $max_rand); //this part is for creating random name for image $ext = end(explode(".", $namePhoto)); //gets extension $file = Yii::app()->request->baseUrl . "photo/" . $name_file . "." . $ext; // Save Photo From Facebook And Add Filter Helper::save_image($urlPhoto, $file); $filter = Instagraph::factory($file, $file); $filter->{$f}(); Helper::debugConsole("Save Photo From Facebook And Add Filter ok"); // 320 Show Preview $immid = new Imagick($file); if ($immid->getimagewidth() > 320) { $immid->thumbnailImage(320, null); $immid->writeImage(Yii::app()->request->baseUrl . "thumb/thumb320_" . $name_file . "." . $ext); $immid->destroy(); chmod(Yii::app()->request->baseUrl . "thumb/thumb320_" . $name_file . "." . $ext, 0777); } else { $immid->writeImage(Yii::app()->request->baseUrl . "thumb/thumb320_" . $name_file . "." . $ext); $immid->destroy(); chmod(Yii::app()->request->baseUrl . "thumb/thumb320_" . $name_file . "." . $ext, 0777); } Helper::debugConsole("320 Show Preview ok"); // null x 230 show last upload $imlast = new Imagick($file); $imlast->thumbnailimage(null, 230); $imlast->writeImage(Yii::app()->request->baseUrl . "thumb/thumb230_" . $name_file . "." . $ext); $imlast->destroy(); chmod(Yii::app()->request->baseUrl . "thumb/thumb230_" . $name_file . "." . $ext, 0777); Helper::debugConsole("null x 230 show last upload ok"); // 130 x 110 thumbmail $im = new Imagick($file); $im->thumbnailImage(130, 110); $im->writeImage(Yii::app()->request->baseUrl . "thumb/thumb_" . $name_file . "." . $ext); chmod(Yii::app()->request->baseUrl . "thumb/thumb_" . $name_file . "." . $ext, 0777); $im->destroy(); Helper::debugConsole("130 x 110 thumbmail ok"); $photo = new Photo(); $photo->link = $file; $photo->fbid = Yii::app()->facebook->getUser(); $photo->ip = $_SERVER['REMOTE_ADDR']; Helper::debugConsole("set data ok"); if ($photo->save()) { $id = $photo->id; $cr = "\n" . "http://www.pla2gram.com/?p=" . $id . "&theater=1"; $capFB = $capPhoto . $cr; Helper::debugConsole("set fb ok"); // Post to Facebook $args = array('message' => $capFB); $args['image'] = '@' . realpath($file); Yii::app()->facebook->api('/me/photos', 'post', $args); Helper::debugConsole("save fb ok"); Helper::redir("/?p=" . $id, 0); } else { print_r($photo->getErrors()); } }
/** * @return mixed */ protected function waterMark() { $oWaterMarkImg = new Imagick($this->_sWaterMarkImgPath); $iWaterMarkWidth = $oWaterMarkImg->getimagewidth(); $iWaterMarkHeight = $oWaterMarkImg->getimageheight(); $iImgWidth = $this->oImage->getimagewidth(); $iImgHeight = $this->oImage->getimageheight(); //图片大小小于水印大小加上30 就不打水印了 if ($iImgWidth < $iWaterMarkWidth + 30 || $iImgHeight < $iWaterMarkHeight + 30) { return true; } switch ($this->_sWaterMarkPosition) { //左下 case "bottom-left": $iDesX = 30; $iDesY = $iImgHeight - $iWaterMarkHeight - 30; break; //右下 //右下 case "bottom-right": $iDesX = $iImgWidth - $iWaterMarkWidth - 30; $iDesY = $iImgHeight - $iWaterMarkHeight - 30; break; //中下 //中下 case "bottom-middle": $iDesX = $iImgHeight / 2 - 15; $iDesY = $iImgHeight - $iWaterMarkHeight - 30; break; //左上 //左上 case "top-left": $iDesX = 30; $iDesY = 30; break; break; //中上 //中上 case "top-middle": $iDesX = $iImgHeight / 2 - 15; $iDesY = 30; break; break; //右上 //右上 case "top-right": $iDesX = $iImgWidth - $iWaterMarkWidth - 30; $iDesY = 30; break; break; //默认右下 //默认右下 default: $iDesX = $iImgWidth - $iWaterMarkWidth - 30; $iDesY = $iImgHeight - $iWaterMarkHeight - 30; break; } if ($this->oImage->getimageformat() == 'GIF') { $aFrame = $this->oImage->coalesceImages(); $draw = new ImagickDraw(); $draw->composite($oWaterMarkImg->getImageCompose(), $iDesX, $iDesY, $iWaterMarkWidth, $iWaterMarkHeight, $oWaterMarkImg); foreach ($aFrame as $frame) { $frame->drawImage($draw); } $aFrame->optimizeimagelayers(); $this->oImage = $aFrame; } else { $draw = new ImagickDraw(); $draw->composite($oWaterMarkImg->getImageCompose(), $iDesX, $iDesY, $iWaterMarkWidth, $iWaterMarkHeight, $oWaterMarkImg); $this->oImage->drawImage($draw); } }
public function RenderImage($strPath = null) { $objImage = new Imagick(); $objImage->ReadImage($this->strImagePath); // Get Image Size $intSourceWidth = $objImage->getimagewidth(); $intSourceHeight = $objImage->getimageheight(); // We need to calculate the following values: $intDestinationWidth = null; $intDestinationHeight = null; $intCanvasWidth = null; $intCanvasHeight = null; ///////////////////////////////////////////// // Calculate Dimensions: Based ONLY on WIDTH ///////////////////////////////////////////// if ($this->strWidth && !$this->strHeight) { // DIMENSIONS THE SAME -- Flow Through if ($this->strWidth == $intSourceWidth) { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $intSourceWidth; $intCanvasHeight = $intSourceHeight; // DESTINATION LARGER than source } else { if ($this->strWidth > $intSourceWidth) { // Do NOT Scale "Up" if (!$this->blnScaleImageUp) { // Scale Canvas -- Flow Through if ($this->blnScaleCanvasDown) { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $intSourceWidth; $intCanvasHeight = $intSourceHeight; // Do NOT Scale Canvas -- Canvas width matches requested width. Destionation matches Source dimensions. } else { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $this->strWidth; $intCanvasHeight = $intSourceHeight; } // SCALE UP source image -- Canvas and Destination widths both match requested width. Canvas and Destination height both need to scale up. } else { $intDestinationWidth = $this->strWidth; $intDestinationHeight = $intSourceHeight * $this->strWidth / $intSourceWidth; $intCanvasWidth = $this->strWidth; $intCanvasHeight = $intSourceHeight * $this->strWidth / $intSourceWidth; } // DESTINATION SMALLER than source -- Scale Down Source Image. Canvas is size of image } else { $intDestinationWidth = $this->strWidth; $intDestinationHeight = $intSourceHeight * $this->strWidth / $intSourceWidth; $intCanvasWidth = $intDestinationWidth; $intCanvasHeight = $intDestinationHeight; } } ///////////////////////////////////////////// // Calculate Dimensions: Based ONLY on HEIGHT ///////////////////////////////////////////// } else { if ($this->strHeight && !$this->strWidth) { // DIMENSIONS THE SAME -- Flow Through if ($this->strHeight == $intSourceHeight) { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $intSourceWidth; $intCanvasHeight = $intSourceHeight; // DESTINATION LARGER than source } else { if ($this->strHeight > $intSourceHeight) { // Do NOT Scale "Up" if (!$this->blnScaleImageUp) { // Scale Canvas -- Flow Through if ($this->blnScaleCanvasDown) { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $intSourceWidth; $intCanvasHeight = $intSourceHeight; // Do NOT Scale Canvas -- Canvas height matches requested height. Destionation matches Source dimensions. } else { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $intSourceWidth; $intCanvasHeight = $this->strHeight; } // SCALE UP source image -- Canvas and Destination heights both match requested height. Canvas and Destination widths both need to scale up. } else { $intDestinationWidth = $intSourceWidth * $this->strHeight / $intSourceHeight; $intDestinationHeight = $this->strHeight; $intCanvasWidth = $intSourceWidth * $this->strHeight / $intSourceHeight; $intCanvasHeight = $this->strHeight; } // DESTINATION SMALLER than source -- Scale Down Source Image. Canvas is size of image } else { $intDestinationWidth = $intSourceWidth * $this->strHeight / $intSourceHeight; $intDestinationHeight = $this->strHeight; $intCanvasWidth = $intDestinationWidth; $intCanvasHeight = $intDestinationHeight; } } ///////////////////////////////////////////// // Calculate Dimensions based on BOTH DIMENSIONS ///////////////////////////////////////////// } else { // DIMENSIONS THE SAME -- Flow Through if ($this->strHeight == $intSourceHeight && $this->strWidth == $intSourceWidth) { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $intSourceWidth; $intCanvasHeight = $intSourceHeight; // DESTINATION LARGER than source } else { if ($this->strHeight >= $intSourceHeight && $this->strWidth >= $intSourceWidth) { // Do NOT Scale "Up" if (!$this->blnScaleImageUp) { // Scale Canvas - Flow Through if ($this->blnScaleCanvasDown) { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $intSourceWidth; $intCanvasHeight = $intSourceHeight; // Do NOT Scale Canvas -- Canvas Dimensions match Requested Dimensions. Destination dimensions match Source Dimensions } else { $intDestinationWidth = $intSourceWidth; $intDestinationHeight = $intSourceHeight; $intCanvasWidth = $this->strWidth; $intCanvasHeight = $this->strHeight; } } } } // If no Dest Width is defined, then we haven't done any calculations yet. This means that we are either // scaling up OR down the source image. Scale Destination Dimensions to the maximum possible, given the requested width/height if (!$intDestinationWidth) { // Calculate Image Proportions for Source and Destination $fltSourceProportions = $intSourceWidth / $intSourceHeight; $fltDestProportions = $this->strWidth / $this->strHeight; // Destination is WIDER than Source -- therefore HEIGHT defined by Requested Height, and Width is calculated if ($fltDestProportions > $fltSourceProportions) { $intDestinationWidth = $intSourceWidth * $this->strHeight / $intSourceHeight; $intDestinationHeight = $this->strHeight; // Destination is TALLER than Source -- therefore WIDTH defined by Requested Width, and Height is calculated } else { if ($fltDestProportions < $fltSourceProportions) { $intDestinationWidth = $this->strWidth; $intDestinationHeight = $intSourceHeight * $this->strWidth / $intSourceWidth; // Destination Proportions MATCH Source Proportions -- Width/Height defined by Requested Width/Height } else { $intDestinationWidth = $this->strWidth; $intDestinationHeight = $this->strHeight; $intCanvasWidth = $intDestinationWidth; $intCanvasHeight = $intDestinationHeight; } } } // If No Canvas Dimensions Defined, Calculate this now if (!$intCanvasWidth) { if ($this->blnScaleCanvasDown) { $intCanvasWidth = $intDestinationWidth; $intCanvasHeight = $intDestinationHeight; } else { $intCanvasWidth = $this->strWidth; $intCanvasHeight = $this->strHeight; } } } } $objImage->resizeimage($intDestinationWidth, $intDestinationHeight, imagick::FILTER_QUADRATIC, 0.5); // Calculate X and Y position $intX = round(($intCanvasWidth - $intDestinationWidth) / 2.0); $intY = round(($intCanvasHeight - $intDestinationHeight) / 2.0); // Create Destination Image $objFinalImage = new Imagick(); $objFinalImage->NewImage($intCanvasWidth, $intCanvasHeight, new ImagickPixel('#' . $this->strBackColor)); $objFinalImage->CompositeImage($objImage, imagick::COMPOSITE_DEFAULT, $intX, $intY); $this->RenderImageMagickHelper($objFinalImage, $strPath); }
/** * Primary processing routine for the source */ private function processBook() { // Get Media manager and preset page parameters $mediaManager = new MediaManager($this->bookId); $pageCount = count($this->sourceFiles) + count($this->sourceAssets); $pageNumber = 1; // Prepare the progress $this->progress->startProgress($pageCount * 2); $this->updatePageCount(0); $bookSizeFound = false; // Loop through source files foreach ($this->sourceFiles as $source) { CakeLog::debug('[ImageProcessor::processBook] processing source file ' . $source); // Get book size if (!$bookSizeFound) { $bookWidth = 0; $bookHeight = 0; $this->getBookSizeImage($source, $bookWidth, $bookHeight); CakeLog::debug('[ImageProcessor::processBook] Book dimensions set to ' . $bookWidth . ' x ' . $bookHeight); $this->updateBookSize($bookWidth, $bookHeight); $bookSizeFound = true; } // Convert to png as needed if (MediaManager::isConvertableImage($source)) { CakeLog::debug('[ImageProcessor::processBook] Converting ' . $source . ' to png'); $mediaManager->imageConvertToPng($source, $source); } // Resize image to max dimension. $image = new Imagick($source); $width = $image->getimagewidth(); $height = $image->getimageheight(); // Get new width and height list($newWidth, $newHeight) = $this->getResizedDimensionsForMaxPixels($width, $height); if ($newHeight != $height || $newWidth != $width) { CakeLog::debug('[ImageProcessor::processBook] ' . $source . ' resized for max pixel limits to ' . $newWidth . 'x' . $newHeight); // Resize the original image $img = new Imagick($source); $img->resizeimage($newWidth, $newHeight, Imagick::FILTER_LANCZOS, 1, false); $img->writeimage(); } $this->addImageAssetToBook($source, 'images/backgrounds/'); $this->savePageHTML('', $pageNumber, null, '../images/backgrounds/' . basename($source)); @unlink($source); $this->savePageCSS('', $pageNumber); // Count page $pageNumber++; // Update the progress in database every 10th page. $this->progress->incrementStep(); } //handle any non-source assets included with the book source files $this->importSourceAssets(); $this->setCoverImage(); // Save default book CSS $this->saveBookCSS(''); // Generate thumbnails $this->generateThumbnails(1, $pageCount); $this->updatePageCount($pageCount); CakeLog::debug('[ImageProcessor::processBook] Book Processing Complete'); }
/** * 添加图片水印 * 有个别水印图片打不漂亮;貌似对jpg图片打出来还不错 * @see Lib_Image_Abstract::watermarkImage() * @param string $watermarkPath 水印图片(最好是透明背景的png图片) * @param string $place 水印位置;具体对应参数如下(可参见常量) * northwest northeast * center * southwest southeast * @param integer $x 水印位置 ; x(水平坐标轴)轴偏移量 * @param integer $y 水印位置 ; y(垂直坐标轴)轴偏移量 * @param integer $alpha 水印透明度。取值0(全透明)-100(完全不透明) ;默认52:半透明 * @param integer $angle 水印图片旋转角度 TODO * @return boolean */ public function watermarkImage($watermarkPath, $place = 'southeast', $x = 18, $y = 18, $alpha = 52, $angle = 0) { if (!is_file($watermarkPath)) { $this->_error = '水印文件不存在'; $this->_im = null; return false; } if (!$this->_isExistIm()) { return false; } try { $watermark = new Imagick(); $watermark->readImage($watermarkPath); $alpha = $alpha / 100; $watermark->setImageOpacity($alpha); // 设置透明度,不知道为什么这里如果设了透明度,有些png水印打出来的图片就不漂亮了 // 在ubuntu 64 位上还是一样 $watermarkW = $watermark->getimagewidth(); $watermarkH = $watermark->getimageheight(); switch ($place) { case self::PLACE_NORTHWEST: break; case self::PLACE_NORTHEAST: $x = $this->_sourceWidth - ($watermarkW + $x); break; case self::PLACE_CENTER: $x = intval(($this->_sourceWidth - $watermarkW) / 2); $y = intval(($this->_sourceHeight - $watermarkH) / 2); break; case self::PLACE_SOUTHWEST: $y = $this->_sourceHeight - ($watermarkH + $y); break; case self::PLACE_SOUTHEAST: $x = $this->_sourceWidth - ($watermarkW + $x); $y = $this->_sourceHeight - ($watermarkH + $y); break; default: $x = $this->_sourceWidth - ($watermarkW + $x); $y = $this->_sourceHeight - ($watermarkH + $y); break; } $compose = $watermark->getImageCompose(); // 方法一 //return $this->_im->compositeimage($watermark, $compose, $x, $y); // 方法二 $draw = new ImagickDraw(); $draw->composite($compose, $x, $y, $watermarkW, $watermarkH, $watermark); if ($this->_sourceType == self::TYPE_GIF) { $this->_im = $this->_im->coalesceImages(); $flag = true; foreach ($this->_im as $frame) { $boolean = $frame->drawImage($draw); if (!$boolean) { $flag = false; $this->_im = null; $this->_error = '添加水印出错!'; break; } } return $flag; } return $this->_im->drawImage($draw); } catch (Exception $e) { $this->_error = '处理水印图片出错'; $this->_im = null; return false; } }
public function build($target_file = false) { $this->_debug('Beginning build!'); $this->clean(); // make sure we have source images $this->_debug('...ensuring source images exist...'); if (count($this->image_bank) == 0) { $this->_gatherSourceImages(); } else { $this->_debug('...complete!', false); } // make sure we have the target file set $this->_debug('...ensuring target is defined...'); if (!$target_file) { $this->_debug('...choosing target image at random...', false); $target_file = $this->image_bank[rand(0, count($this->image_bank) - 1)]['orig_file']; $this->_debug('...' . $target_file . ' chosen!', false); } else { $this->_debug('...complete!', false); } $this->_debug('...ensuring target file availability...'); if (!file_exists(getcwd() . $target_file)) { show_error('Target file is not available'); } $this->_debug('...complete!', false); // determine map size $this->_debug('...determining map sizing...'); $size = getimagesize(getcwd() . $target_file); $w = $this->config['num_columns']; $h = floor($size[1] * ($w / $size[0])); $this->_debug('...complete!', false); // create map image $this->_debug('...creating map image from ' . $target_file . '...'); $map_img = new Imagick(getcwd() . $target_file); $map_img->resizeimage($w, $h, $this->resize_filter, 1); $this->_debug('...complete!', false); // build map $this->_debug('...building pixel map...'); for ($y = 0; $y < $h; $y++) { for ($x = 0; $x < $w; $x++) { $p = $map_img->getimagepixelcolor($x, $y); $map[$x][$y] = $p->getcolor(); } } $map_img = null; $this->_debug('...complete!', false); $this->_debug('...creating Prosaic canvas...'); $output = new Imagick(); $output->newimage($w * $this->config['tile_size'], $h * $this->config['tile_size'], 'white'); $this->_debug('...complete!', false); $this->_debug('...gathering Prosaic setup information...'); $images = array(); $positions = array(); $rgb = array(); for ($y = 0; $y < count($map[0]); $y++) { for ($x = 0; $x < count($map); $x++) { $images[] = $this->image_bank[$this->_getImageClosestToPixel($map[$x][$y])]['orig_file']; $positions[] = [$x * $this->config['tile_size'], $y * $this->config['tile_size']]; $rgb[] = $map[$x][$y]; } } $this->_debug('...complete!', false); $this->_debug(var_export($this->used_images, true)); $this->_debug('...adding images to Prosaic...'); $count = 0; $opacity = new ImagickPixel('rgba(128, 128, 128, 1)'); foreach ($images as $image) { $next = $tint = null; $next = new Imagick(getcwd() . $image); $tint_string = 'rgb(' . $rgb[$count]['r'] . ', ' . $rgb[$count]['g'] . ', ' . $rgb[$count]['b'] . ')'; $this->_debug('...tinting image with ' . $tint_string . '...'); $tint = new ImagickPixel($tint_string); if (!$next->tintimage($tint, $opacity)) { $this->_debug('FAILED!...', false); } $this->_debug('and again', false); if (!$next->tintimage($tint, $opacity)) { $this->_debug('FAILED!...', false); } $this->_debug('...resizing image ' . $count . '...', false); $next->resizeimage($this->config['tile_size'], $this->config['tile_size'], $this->resize_filter, 1); $this->_debug('...setting page...', false); $next->setimagepage($next->getimagewidth(), $next->getimageheight(), $positions[$count][0], $positions[$count][1]); $this->_debug('...adding image...', false); $output->addimage($next); $this->_debug('...complete!', false); $count++; } $this->_debug('...images added!'); $this->_debug('...buildling Prosaic...'); $result = $output->mergeimagelayers(Imagick::LAYERMETHOD_MOSAIC); $output = null; $result->setimageformat($this->config['target_format']); $this->_debug('...complete!', false); $filename = $this->config['source_image_folder'] . $this->config['target_filename'] . '.' . $this->config['target_format']; $this->_debug('...saving Prosaic as ' . $filename . '...'); if (!$result->writeimage($filename)) { show_error('Could not create Prosaic file'); } $this->_debug('...complete!', false); $this->_debug('Build complete!'); }