/** * PNG ALPHA CHANNEL SUPPORT for imagecopymerge(); * by Sina Salek * * Bugfix by Ralph Voigt (bug which causes it * to work only for $src_x = $src_y = 0. * Also, inverting opacity is not necessary.) * 08-JAN-2011 * **/ function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct, $dst_im_ext) { if ($dst_im_ext == 'jpg' && $pct == 100) { imagealphablending($dst_im, true); imagealphablending($src_im, true); imagecopy($dst_im, $src_im, $dst_x, $dst_y, 0, 0, $src_w, $src_h); } else { $transparent_index = imagecolortransparent($dst_im); $colors_total = imagecolorstotal($dst_im); $cut = imagecreatetruecolor($src_w, $src_h); if ($transparent_index >= 0) { $transparent_color = imagecolorsforindex($dst_im, $transparent_index); $transparent_index = imagecolorallocatealpha($cut, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue'], 127); imagefill($cut, 0, 0, $transparent_index); imagecolortransparent($cut, $transparent_index); } else { $color = imagecolorallocatealpha($cut, 0, 0, 0, 127); imagefill($cut, 0, 0, $color); } if ($dst_im_ext == 'png') { imagealphablending($dst_im, false); imagesavealpha($dst_im, true); } else { if ($dst_im_ext !== 'jpg') { imagetruecolortopalette($dst_im, true, 255); imagesavealpha($dst_im, false); } } if ($dst_im_ext == 'png' && $colors_total == 0) { if ($pct < 100) { filter_opacity($src_im, $pct); } imagealphablending($dst_im, true); imagesavealpha($dst_im, true); imagecopy($dst_im, $src_im, $dst_x, $dst_y, 0, 0, $src_w, $src_h); imagealphablending($dst_im, false); } else { imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h); imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h); imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct); } } imagedestroy($cut); imagedestroy($src_im); }
function create_watermark($source_file_path, $output_file_path) { list(, , $source_type) = getimagesize($source_file_path); if ($source_type === NULL) { return false; } switch ($source_type) { case IMAGETYPE_GIF: $source_gd_image = imagecreatefromgif($source_file_path); break; case IMAGETYPE_JPEG: $source_gd_image = imagecreatefromjpeg($source_file_path); break; case IMAGETYPE_PNG: $source_gd_image = imagecreatefrompng($source_file_path); break; default: return false; } list(, , $output_type) = getimagesize(WATERMARK_OVERLAY_IMAGE); if ($output_type === NULL) { return false; } switch ($output_type) { case IMAGETYPE_GIF: $overlay_gd_image = imagecreatefromgif(WATERMARK_OVERLAY_IMAGE); break; case IMAGETYPE_JPEG: $overlay_gd_image = imagecreatefromjpeg(WATERMARK_OVERLAY_IMAGE); break; case IMAGETYPE_PNG: $overlay_gd_image = imagecreatefrompng(WATERMARK_OVERLAY_IMAGE); imagealphablending($overlay_gd_image, true); break; default: return false; } filter_opacity($overlay_gd_image, WATERMARK_OVERLAY_OPACITY); $overlay_width = imagesx($overlay_gd_image); $overlay_height = imagesy($overlay_gd_image); $coordinates = explode(',', WATERMARK_OUTPUT_COORDINATES); $length = count($coordinates); for ($i = 0; $i < $length; $i = $i + 2) { imagecopy($source_gd_image, $overlay_gd_image, $coordinates[$i], $coordinates[$i + 1], 0, 0, $overlay_width, $overlay_height); } if ($source_type['mime'] == 'image/png') { imagepng($source_gd_image, $output_file_path); } else { imagejpeg($source_gd_image, $output_file_path, WATERMARK_OUTPUT_QUALITY); } imagedestroy($source_gd_image); imagedestroy($overlay_gd_image); }