/** * Resizes image * @param string $src source image path * @param integer $new_width new image width * @param integer $new_height new image height * @param string $bg_color new image background color * @param array $custom_settings custom convertion settings * @return array - new image contents and format */ function fn_resize_image($src, $new_width = 0, $new_height = 0, $bg_color = '#ffffff', $custom_settings = array()) { static $general_settings = array(); if (empty($general_settings)) { $general_settings = Settings::instance()->getValues('Thumbnails'); } gc_collect_cycles(); $settings = empty($custom_settings) ? $general_settings : $custom_settings; /** @var \Imagine\Image\ImagineInterface $imagine */ $imagine = Tygh::$app['image']; $format = $settings['convert_to']; if ($format === 'original') { if ($original_file_type = fn_get_image_extension(fn_get_mime_content_type($src, true))) { $format = $original_file_type; } else { $format = 'png'; } } $transparency = null; if (empty($bg_color)) { $bg_color = '#FFF'; if ($format == 'png' || $format == 'gif') { $transparency = 0; } } elseif (!preg_match('/^#([0-9a-f]{3}){1,2}$/i', $bg_color)) { $bg_color = '#FFF'; } try { $image = $imagine->open($src); list($new_width, $new_height) = ImageHelper::originalProportionsFallback($image->getSize()->getWidth(), $image->getSize()->getHeight(), $new_width, $new_height); // This is a non-necessary operation // which can however trigger exceptions if isn't supported by a driver fn_catch_exception(function () use($image) { $image->usePalette(new \Imagine\Image\Palette\RGB()); }); $filter = $imagine instanceof \Imagine\Gd\Imagine ? \Imagine\Image\ImageInterface::FILTER_UNDEFINED : \Imagine\Image\ImageInterface::FILTER_LANCZOS; $new_size = new \Imagine\Image\Box($new_width, $new_height); $thumbnail = $image->thumbnail($new_size, \Imagine\Image\ImageInterface::THUMBNAIL_INSET, $filter); // In case that created thumbnail is smaller than required size, we create // an empty canvas of required size and center thumbnail on it $thumbnail_coordinates = new \Imagine\Image\Point((int) (($new_size->getWidth() - $thumbnail->getSize()->getWidth()) / 2), (int) (($new_size->getHeight() - $thumbnail->getSize()->getHeight()) / 2)); if (!$image->palette()->supportsAlpha()) { $transparency = null; } $canvas_color = $image->palette()->color($bg_color, $transparency); $canvas = $imagine->create($new_size, $canvas_color); $canvas->paste($thumbnail, $thumbnail_coordinates); unset($thumbnail, $image); $thumbnail = $canvas; $options = array('jpeg_quality' => $settings['jpeg_quality'], 'png_compression_level' => 9, 'filter' => $filter, 'flatten' => true); $return = array($thumbnail->get($format, $options), $format); unset($thumbnail); gc_collect_cycles(); return $return; } catch (\Exception $e) { $error_message = __('error_unable_to_create_thumbnail', array('[error]' => $e->getMessage(), '[file]' => $src)); if (AREA == 'A') { fn_set_notification('E', __('error'), $error_message); } gc_collect_cycles(); return false; } }
function fn_watermark_create($source_filepath, $target_filepath, $is_detailed = false, $company_id = null, $generate_watermark = true) { $original_abs_path = Storage::instance('images')->getAbsolutePath($source_filepath); list(, , , $original_abs_path) = fn_get_image_size($original_abs_path); if (!$generate_watermark) { Storage::instance('images')->put($target_filepath, array('file' => $original_abs_path, 'keep_origins' => true)); return true; } $settings = fn_get_watermark_settings($company_id); if (empty($settings)) { return false; } list($settings['horizontal_position'], $settings['vertical_position']) = explode('_', $settings['position']); gc_collect_cycles(); /** @var \Imagine\Image\ImagineInterface $imagine */ $imagine = Tygh::$app['image']; try { $image = $imagine->open($original_abs_path); fn_catch_exception(function () use($image) { $image->usePalette(new \Imagine\Image\Palette\RGB()); }); $filter = $imagine instanceof \Imagine\Gd\Imagine ? \Imagine\Image\ImageInterface::FILTER_UNDEFINED : \Imagine\Image\ImageInterface::FILTER_LANCZOS; if ($settings['type'] == WATERMARK_TYPE_GRAPHIC) { $watermark_image_file_path = false; if ($is_detailed) { if (!empty($settings['image_pair']['detailed']['absolute_path'])) { $watermark_image_file_path = $settings['image_pair']['detailed']['absolute_path']; } } elseif (!empty($settings['image_pair']['icon']['absolute_path'])) { $watermark_image_file_path = $settings['image_pair']['icon']['absolute_path']; } if (!$watermark_image_file_path) { return false; } list(, , , $watermark_image_file_path) = fn_get_image_size($watermark_image_file_path); $watermark_image = $imagine->open($watermark_image_file_path); fn_catch_exception(function () use($watermark_image) { $watermark_image->usePalette(new \Imagine\Image\Palette\RGB()); }); // Watermark image > canvas image $watermark_size = $watermark_image->getSize()->increase(WATERMARK_PADDING * 2); if (!$image->getSize()->contains($watermark_size)) { $ratio = min(array($image->getSize()->getWidth() / $watermark_size->getWidth(), $image->getSize()->getHeight() / $watermark_size->getHeight())); $watermark_size = $watermark_size->scale($ratio); $watermark_size = $watermark_size->increase(-WATERMARK_PADDING * 2); $watermark_image->resize($watermark_size, $filter); } $watermark_position = ImageHelper::positionLayerOnCanvas($image->getSize(), $watermark_image->getSize(), $settings['horizontal_position'], $settings['vertical_position'], new \Imagine\Image\Box(WATERMARK_PADDING, WATERMARK_PADDING)); $image->paste($watermark_image, $watermark_position); unset($watermark_image); } elseif ($settings['type'] == WATERMARK_TYPE_TEXT) { $font_path = Registry::get('config.dir.lib') . 'other/fonts/' . $settings['font'] . '.ttf'; $font_size = $is_detailed ? $settings['font_size_detailed'] : $settings['font_size_icon']; $font_alpha_blend = null; switch ($settings['font_color']) { case 'white': $font_color = array(255, 255, 255); break; case 'black': $font_color = array(0, 0, 0); break; case 'gray': $font_color = array(120, 120, 120); break; case 'clear_gray': default: $font_color = array(120, 120, 120); $font_alpha_blend = WATERMARK_FONT_ALPHA; break; } // For example CMYK palette doesn't support alphachannel if (!$image->palette()->supportsAlpha()) { $font_alpha_blend = null; } $font = $imagine->font($font_path, $font_size, $image->palette()->color($font_color, $font_alpha_blend)); $text_layer_size = ImageHelper::calculateTextSize($settings['text'], $font); $watermark_position = ImageHelper::positionLayerOnCanvas($image->getSize(), $text_layer_size, $settings['horizontal_position'], $settings['vertical_position'], new \Imagine\Image\Box(WATERMARK_PADDING, WATERMARK_PADDING)); $image->draw()->text($settings['text'], $font, $watermark_position); unset($font); } $settings = Settings::instance()->getValues('Thumbnails'); $options = array('jpeg_quality' => $settings['jpeg_quality'], 'png_compression_level' => 9, 'filter' => $filter); if ($original_file_type = fn_get_image_extension(fn_get_mime_content_type($original_abs_path, false))) { $format = $original_file_type; } else { $format = 'png'; } Storage::instance('images')->put($target_filepath, array('contents' => $image->get($format, $options))); unset($image); gc_collect_cycles(); return true; } catch (\Exception $e) { $error_message = __('error_unable_to_create_thumbnail', array('[error]' => $e->getMessage(), '[file]' => $source_filepath)); if (AREA == 'A') { fn_set_notification('E', __('error'), $error_message); } gc_collect_cycles(); return false; } }