/** * * long description * @global object * @param object $dst_img * @param object $src_img * @param int $dst_x * @param int $dst_y * @param int $src_x * @param int $src_y * @param int $dst_w * @param int $dst_h * @param int $src_w * @param int $src_h * @return bool * @todo Finish documenting this function */ function ImageCopyBicubic($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) { global $CFG; if (function_exists('ImageCopyResampled') and $CFG->gdversion >= 2) { return ImageCopyResampled($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); } $totalcolors = imagecolorstotal($src_img); for ($i = 0; $i < $totalcolors; $i++) { if ($colors = ImageColorsForIndex($src_img, $i)) { ImageColorAllocate($dst_img, $colors['red'], $colors['green'], $colors['blue']); } } $scaleX = ($src_w - 1) / $dst_w; $scaleY = ($src_h - 1) / $dst_h; $scaleX2 = $scaleX / 2.0; $scaleY2 = $scaleY / 2.0; for ($j = 0; $j < $dst_h; $j++) { $sY = $j * $scaleY; for ($i = 0; $i < $dst_w; $i++) { $sX = $i * $scaleX; $c1 = ImageColorsForIndex($src_img, ImageColorAt($src_img, (int) $sX, (int) $sY + $scaleY2)); $c2 = ImageColorsForIndex($src_img, ImageColorAt($src_img, (int) $sX, (int) $sY)); $c3 = ImageColorsForIndex($src_img, ImageColorAt($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2)); $c4 = ImageColorsForIndex($src_img, ImageColorAt($src_img, (int) $sX + $scaleX2, (int) $sY)); $red = (int) (($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4); $green = (int) (($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4); $blue = (int) (($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4); $color = ImageColorClosest($dst_img, $red, $green, $blue); ImageSetPixel($dst_img, $i + $dst_x, $j + $dst_y, $color); } } }
function frame($light_colour = "FFFFFF", $dark_colour = "000000", $mid_width = 4, $frame_colour = "") { $this->rw = $mid_width; $this->dh = $dark_colour; $this->lh = $light_colour; $this->frc = $frame_colour; $this->fr = $this->hex2rgb(substr($this->dh, 0, 2)); $this->fg = $this->hex2rgb(substr($this->dh, 2, 2)); $this->fb = $this->hex2rgb(substr($this->dh, 4, 2)); $this->gr = $this->hex2rgb(substr($this->lh, 0, 2)); $this->gg = $this->hex2rgb(substr($this->lh, 2, 2)); $this->gb = $this->hex2rgb(substr($this->lh, 4, 2)); $this->zen = @ImageColorClosest($this->t, $this->gr, $this->gg, $this->gb); $this->nad = @ImageColorClosest($this->t, $this->fr, $this->fg, $this->fb); $this->mid = $this->frc == "" ? @ImageColorClosest($this->t, ($this->gr + $this->fr) / 2, ($this->gg + $this->fg) / 2, ($this->gb + $this->fb) / 2) : ImageColorClosest($this->t, $this->hex2rgb(substr($this->frc, 0, 2)), $this->hex2rgb(substr($this->frc, 2, 2)), $this->hex2rgb(substr($this->frc, 4, 2))); @imageline($this->t, 0, 0, $this->q, 0, $this->zen); @imageline($this->t, 0, 0, 0, $this->r, $this->zen); @imageline($this->t, $this->q - 1, 0, $this->q - 1, $this->r, $this->nad); @imageline($this->t, 0, $this->r - 1, $this->q, $this->r - 1, $this->nad); @imageline($this->t, $this->rw + 1, $this->r - ($this->rw + 2), $this->q - ($this->rw + 2), $this->r - ($this->rw + 2), $this->zen); // base in @imageline($this->t, $this->q - ($this->rw + 2), $this->rw + 1, $this->q - ($this->rw + 2), $this->r - ($this->rw + 2), $this->zen); // right in @imageline($this->t, $this->rw + 1, $this->rw + 1, $this->q - ($this->rw + 1), $this->rw + 1, $this->nad); @imageline($this->t, $this->rw + 1, $this->rw + 1, $this->rw + 1, $this->r - ($this->rw + 1), $this->nad); for ($this->crw = 0; $this->crw < $this->rw; $this->crw++) { @imageline($this->t, $this->crw + 1, $this->crw + 1, $this->q - ($this->crw + 1), $this->crw + 1, $this->mid); // top @imageline($this->t, $this->crw + 1, $this->r - ($this->crw + 2), $this->q - ($this->crw + 1), $this->r - ($this->crw + 2), $this->mid); // base @imageline($this->t, $this->crw + 1, $this->crw + 1, $this->crw + 1, $this->r - ($this->crw + 1), $this->mid); //left @imageline($this->t, $this->q - ($this->crw + 2), $this->crw, $this->q - ($this->crw + 2), $this->r - ($this->crw + 1), $this->mid); // right } }
/** * alternative workaround function for bicubic resizing. works well for downsizing and upsizing. VERY VERY slow. taken from php.net comments * * @access private */ function _imageCopyResampledWorkaround2(&$dst_img, &$src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) { ImagePaletteCopy($dst_img, $src_img); $rX = $src_w / $dst_w; $rY = $src_h / $dst_h; $w = 0; for ($y = $dst_y; $y < $dst_h; $y++) { $ow = $w; $w = round(($y + 1) * $rY); $t = 0; for ($x = $dst_x; $x < $dst_w; $x++) { $r = $g = $b = 0; $a = 0; $ot = $t; $t = round(($x + 1) * $rX); for ($u = 0; $u < $w - $ow; $u++) { for ($p = 0; $p < $t - $ot; $p++) { $c = ImageColorsForIndex($src_img, ImageColorAt($src_img, $ot + $p, $ow + $u)); $r += $c['red']; $g += $c['green']; $b += $c['blue']; $a++; } } ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img, $r / $a, $g / $a, $b / $a)); } } }
/** * @param $dst_img * @param $src_img * @param $dst_x * @param $dst_y * @param $src_x * @param $src_y * @param $dst_w * @param $dst_h * @param $src_w * @param $src_h */ function ImageCopyResampleBicubic(&$dst_img, &$src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) { $palsize = ImageColorsTotal($src_img); for ($i = 0; $i < $palsize; $i++) { // get palette. $colors = ImageColorsForIndex($src_img, $i); ImageColorAllocate($dst_img, $colors['red'], $colors['green'], $colors['blue']); } $scaleX = ($src_w - 1) / $dst_w; $scaleY = ($src_h - 1) / $dst_h; $scaleX2 = (int) ($scaleX / 2); $scaleY2 = (int) ($scaleY / 2); for ($j = $src_y; $j < $dst_h; $j++) { $sY = (int) ($j * $scaleY); $y13 = $sY + $scaleY2; for ($i = $src_x; $i < $dst_w; $i++) { $sX = (int) ($i * $scaleX); $x34 = $sX + $scaleX2; $color1 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $sX, $y13)); $color2 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $sX, $sY)); $color3 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x34, $y13)); $color4 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x34, $sY)); $red = ($color1['red'] + $color2['red'] + $color3['red'] + $color4['red']) / 4; $green = ($color1['green'] + $color2['green'] + $color3['green'] + $color4['green']) / 4; $blue = ($color1['blue'] + $color2['blue'] + $color3['blue'] + $color4['blue']) / 4; ImageSetPixel($dst_img, $i + $dst_x - $src_x, $j + $dst_y - $src_y, ImageColorClosest($dst_img, $red, $green, $blue)); } } }
function PlotPixelsGD(&$BMPdata, $truecolor = true) { $imagewidth = $BMPdata['header']['raw']['width']; $imageheight = $BMPdata['header']['raw']['height']; if ($truecolor) { $gd = @ImageCreateTrueColor($imagewidth, $imageheight); } else { $gd = @ImageCreate($imagewidth, $imageheight); if (!empty($BMPdata['palette'])) { // create GD palette from BMP palette foreach ($BMPdata['palette'] as $dummy => $color) { list($r, $g, $b) = $this->IntColor2RGB($color); ImageColorAllocate($gd, $r, $g, $b); } } else { // create 216-color websafe palette for ($r = 0x0; $r <= 0xff; $r += 0x33) { for ($g = 0x0; $g <= 0xff; $g += 0x33) { for ($b = 0x0; $b <= 0xff; $b += 0x33) { ImageColorAllocate($gd, $r, $g, $b); } } } } } if (!is_resource($gd)) { return false; } foreach ($BMPdata['data'] as $row => $colarray) { @set_time_limit(30); foreach ($colarray as $col => $color) { list($red, $green, $blue) = $this->IntColor2RGB($color); if ($truecolor) { $pixelcolor = ImageColorAllocate($gd, $red, $green, $blue); } else { $pixelcolor = ImageColorClosest($gd, $red, $green, $blue); } ImageSetPixel($gd, $col, $row, $pixelcolor); } } return $gd; }
public static function imageCopyResampledBicubic(&$dst_image, &$src_image, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) { // We should first cut the piece we are interested in from the source $src_img = ImageCreateTrueColor($src_w, $src_h); imagecopy($src_img, $src_image, 0, 0, $src_x, $src_y, $src_w, $src_h); // This one is used as temporary image $dst_img = ImageCreateTrueColor($dst_w, $dst_h); ImagePaletteCopy($dst_img, $src_img); $rX = $src_w / $dst_w; $rY = $src_h / $dst_h; $w = 0; for ($y = 0; $y < $dst_h; $y++) { $ow = $w; $w = round(($y + 1) * $rY); $t = 0; for ($x = 0; $x < $dst_w; $x++) { $r = $g = $b = 0; $a = 0; $ot = $t; $t = round(($x + 1) * $rX); for ($u = 0; $u < $w - $ow; $u++) { for ($p = 0; $p < $t - $ot; $p++) { $c = ImageColorsForIndex($src_img, ImageColorAt($src_img, $ot + $p, $ow + $u)); $r += $c['red']; $g += $c['green']; $b += $c['blue']; $a++; } } ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img, $r / $a, $g / $a, $b / $a)); } } // Apply the temp image over the returned image and use the destination x,y coordinates imagecopy($dst_image, $dst_img, $dst_x, $dst_y, 0, 0, $dst_w, $dst_h); // We should return true since ImageCopyResampled/ImageCopyResized do it return true; }
/** * Unifies all colors given in the colArr color array to the first color in the array. * * @param resource $img Image resource * @param array $colArr Array containing RGB color arrays * @param bool $closest * @return int The index of the unified color */ public function unifyColors(&$img, $colArr, $closest = false) { $retCol = -1; if (is_array($colArr) && !empty($colArr) && function_exists('imagepng') && function_exists('imagecreatefrompng')) { $firstCol = array_shift($colArr); $firstColArr = $this->convertColor($firstCol); $origName = $preName = $this->randomName() . '.png'; $postName = $this->randomName() . '.png'; $tmpImg = null; if (count($colArr) > 1) { $this->imageWrite($img, $preName); $firstCol = $this->hexColor($firstColArr); foreach ($colArr as $transparentColor) { $transparentColor = $this->convertColor($transparentColor); $transparentColor = $this->hexColor($transparentColor); $cmd = '-fill "' . $firstCol . '" -opaque "' . $transparentColor . '"'; $this->imageMagickExec($preName, $postName, $cmd); $preName = $postName; } $this->imageMagickExec($postName, $origName, ''); if (@is_file($origName)) { $tmpImg = $this->imageCreateFromFile($origName); } } else { $tmpImg = $img; } if ($tmpImg) { $img = $tmpImg; if ($closest) { $retCol = ImageColorClosest($img, $firstColArr[0], $firstColArr[1], $firstColArr[2]); } else { $retCol = ImageColorExact($img, $firstColArr[0], $firstColArr[1], $firstColArr[2]); } } // Unlink files from process if (!$this->dontUnlinkTempFiles) { if ($origName) { @unlink($origName); } if ($postName) { @unlink($postName); } } } return $retCol; }
function ImageCopyResampleBicubic($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) { for ($i = 0; $i < imagecolorstotal($src_img); $i++) { $colors = ImageColorsForIndex($src_img, $i); ImageColorAllocate($dst_img, $colors['red'], $colors['green'], $colors['blue']); } $scaleX = ($src_w - 1) / $dst_w; $scaleY = ($src_h - 1) / $dst_h; $scaleX2 = $scaleX / 2.0; $scaleY2 = $scaleY / 2.0; for ($j = $src_y; $j < $src_y + $dst_h; $j++) { $sY = $j * $scaleY; for ($i = $src_x; $i < $src_x + $dst_w; $i++) { $sX = $i * $scaleX; $c1 = ImageColorsForIndex($src_img, ImageColorAt($src_img, (int) $sX, (int) $sY + $scaleY2)); $c2 = ImageColorsForIndex($src_img, ImageColorAt($src_img, (int) $sX, (int) $sY)); $c3 = ImageColorsForIndex($src_img, ImageColorAt($src_img, (int) $sX + $scaleX2, (int) $sY + $scaleY2)); $c4 = ImageColorsForIndex($src_img, ImageColorAt($src_img, (int) $sX + $scaleX2, (int) $sY)); $red = (int) (($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4); $green = (int) (($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4); $blue = (int) (($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4); $color = ImageColorClosest($dst_img, $red, $green, $blue); ImageSetPixel($dst_img, $dst_x + $i - $src_x, $dst_y + $j - $src_y, $color); } } }
/** * Given a user id this function scales and crops the user images to remove * the one pixel black border. * * @global object * @param int $id * @param string $dir * @return boolean */ function upgrade_profile_image($id, $dir = 'users') { global $CFG, $OUTPUT; $im = ImageCreateFromJPEG($CFG->dataroot . '/' . $dir . '/' . $id . '/f1.jpg'); if (function_exists('ImageCreateTrueColor') and $CFG->gdversion >= 2) { $im1 = ImageCreateTrueColor(100, 100); $im2 = ImageCreateTrueColor(35, 35); } else { $im1 = ImageCreate(100, 100); $im2 = ImageCreate(35, 35); } if (function_exists('ImageCopyResampled') and $CFG->gdversion >= 2) { ImageCopyBicubic($im1, $im, 0, 0, 2, 2, 100, 100, 96, 96); } else { imagecopy($im1, $im, 0, 0, 0, 0, 100, 100); $c = ImageColorsForIndex($im1, ImageColorAt($im1, 2, 2)); $color = ImageColorClosest($im1, $c['red'], $c['green'], $c['blue']); ImageSetPixel($im1, 0, 0, $color); $c = ImageColorsForIndex($im1, ImageColorAt($im1, 2, 97)); $color = ImageColorClosest($im1, $c['red'], $c['green'], $c['blue']); ImageSetPixel($im1, 0, 99, $color); $c = ImageColorsForIndex($im1, ImageColorAt($im1, 97, 2)); $color = ImageColorClosest($im1, $c['red'], $c['green'], $c['blue']); ImageSetPixel($im1, 99, 0, $color); $c = ImageColorsForIndex($im1, ImageColorAt($im1, 97, 97)); $color = ImageColorClosest($im1, $c['red'], $c['green'], $c['blue']); ImageSetPixel($im1, 99, 99, $color); for ($x = 1; $x < 99; $x++) { $c1 = ImageColorsForIndex($im1, ImageColorAt($im, $x, 1)); $color = ImageColorClosest($im, $c1['red'], $c1['green'], $c1['blue']); ImageSetPixel($im1, $x, 0, $color); $c2 = ImageColorsForIndex($im1, ImageColorAt($im1, $x, 98)); $color = ImageColorClosest($im, $c2['red'], $c2['green'], $c2['blue']); ImageSetPixel($im1, $x, 99, $color); } for ($y = 1; $y < 99; $y++) { $c3 = ImageColorsForIndex($im1, ImageColorAt($im, 1, $y)); $color = ImageColorClosest($im, $c3['red'], $c3['green'], $c3['blue']); ImageSetPixel($im1, 0, $y, $color); $c4 = ImageColorsForIndex($im1, ImageColorAt($im1, 98, $y)); $color = ImageColorClosest($im, $c4['red'], $c4['green'], $c4['blue']); ImageSetPixel($im1, 99, $y, $color); } } ImageCopyBicubic($im2, $im, 0, 0, 2, 2, 35, 35, 96, 96); if (function_exists('ImageJpeg')) { if (ImageJpeg($im1, $CFG->dataroot . '/' . $dir . '/' . $id . '/f1.jpg', 90) and ImageJpeg($im2, $CFG->dataroot . '/' . $dir . '/' . $id . '/f2.jpg', 95)) { @chmod($CFG->dataroot . '/' . $dir . '/' . $id . '/f1.jpg', 0666); @chmod($CFG->dataroot . '/' . $dir . '/' . $id . '/f2.jpg', 0666); return 1; } } else { echo $OUTPUT->notification('PHP has not been configured to support JPEG images. Please correct this.'); } return 0; }
/** * The actual rendering of the image file. * Basically sets the dimensions, the background color, the traverses the array of GIFBUILDER objects and finally setting the transparent color if defined. * Creates a GDlib resource in $this->im and works on that * Called by gifBuild() * * @return void * @access private * @see gifBuild() */ public function make() { // Get trivial data $XY = $this->XY; // Reset internal properties $this->saveAlphaLayer = false; // Gif-start $this->im = imagecreatetruecolor($XY[0], $XY[1]); $this->w = $XY[0]; $this->h = $XY[1]; // Transparent layer as background if set and requirements are met if (!empty($this->setup['backColor']) && $this->setup['backColor'] === 'transparent' && $this->png_truecolor && !$this->setup['reduceColors'] && (empty($this->setup['format']) || $this->setup['format'] === 'png')) { // Set transparency properties imagesavealpha($this->im, true); // Fill with a transparent background $transparentColor = imagecolorallocatealpha($this->im, 0, 0, 0, 127); imagefill($this->im, 0, 0, $transparentColor); // Set internal properties to keep the transparency over the rendering process $this->saveAlphaLayer = true; // Force PNG in case no format is set $this->setup['format'] = 'png'; $BGcols = array(); } else { // Fill the background with the given color $BGcols = $this->convertColor($this->setup['backColor']); $Bcolor = ImageColorAllocate($this->im, $BGcols[0], $BGcols[1], $BGcols[2]); ImageFilledRectangle($this->im, 0, 0, $XY[0], $XY[1], $Bcolor); } // Traverse the GIFBUILDER objects an render each one: if (is_array($this->setup)) { $sKeyArray = TemplateService::sortedKeyList($this->setup); foreach ($sKeyArray as $theKey) { $theValue = $this->setup[$theKey]; if ((int) $theKey && ($conf = $this->setup[$theKey . '.'])) { // apply stdWrap to all properties, except for TEXT objects // all properties of the TEXT sub-object have already been stdWrap-ped // before in ->checkTextObj() if ($theValue !== 'TEXT') { $isStdWrapped = array(); foreach ($conf as $key => $value) { $parameter = rtrim($key, '.'); if (!$isStdWrapped[$parameter] && isset($conf[$parameter . '.'])) { $conf[$parameter] = $this->cObj->stdWrap($conf[$parameter], $conf[$parameter . '.']); $isStdWrapped[$parameter] = 1; } } } switch ($theValue) { case 'IMAGE': if ($conf['mask']) { $this->maskImageOntoImage($this->im, $conf, $this->workArea); } else { $this->copyImageOntoImage($this->im, $conf, $this->workArea); } break; case 'TEXT': if (!$conf['hide']) { if (is_array($conf['shadow.'])) { $isStdWrapped = array(); foreach ($conf['shadow.'] as $key => $value) { $parameter = rtrim($key, '.'); if (!$isStdWrapped[$parameter] && isset($conf[$parameter . '.'])) { $conf['shadow.'][$parameter] = $this->cObj->stdWrap($conf[$parameter], $conf[$parameter . '.']); $isStdWrapped[$parameter] = 1; } } $this->makeShadow($this->im, $conf['shadow.'], $this->workArea, $conf); } if (is_array($conf['emboss.'])) { $isStdWrapped = array(); foreach ($conf['emboss.'] as $key => $value) { $parameter = rtrim($key, '.'); if (!$isStdWrapped[$parameter] && isset($conf[$parameter . '.'])) { $conf['emboss.'][$parameter] = $this->cObj->stdWrap($conf[$parameter], $conf[$parameter . '.']); $isStdWrapped[$parameter] = 1; } } $this->makeEmboss($this->im, $conf['emboss.'], $this->workArea, $conf); } if (is_array($conf['outline.'])) { $isStdWrapped = array(); foreach ($conf['outline.'] as $key => $value) { $parameter = rtrim($key, '.'); if (!$isStdWrapped[$parameter] && isset($conf[$parameter . '.'])) { $conf['outline.'][$parameter] = $this->cObj->stdWrap($conf[$parameter], $conf[$parameter . '.']); $isStdWrapped[$parameter] = 1; } } $this->makeOutline($this->im, $conf['outline.'], $this->workArea, $conf); } $conf['imgMap'] = 1; $this->makeText($this->im, $conf, $this->workArea); } break; case 'OUTLINE': if ($this->setup[$conf['textObjNum']] == 'TEXT' && ($txtConf = $this->checkTextObj($this->setup[$conf['textObjNum'] . '.']))) { $this->makeOutline($this->im, $conf, $this->workArea, $txtConf); } break; case 'EMBOSS': if ($this->setup[$conf['textObjNum']] == 'TEXT' && ($txtConf = $this->checkTextObj($this->setup[$conf['textObjNum'] . '.']))) { $this->makeEmboss($this->im, $conf, $this->workArea, $txtConf); } break; case 'SHADOW': if ($this->setup[$conf['textObjNum']] == 'TEXT' && ($txtConf = $this->checkTextObj($this->setup[$conf['textObjNum'] . '.']))) { $this->makeShadow($this->im, $conf, $this->workArea, $txtConf); } break; case 'BOX': $this->makeBox($this->im, $conf, $this->workArea); break; case 'EFFECT': $this->makeEffect($this->im, $conf); break; case 'ADJUST': $this->adjust($this->im, $conf); break; case 'CROP': $this->crop($this->im, $conf); break; case 'SCALE': $this->scale($this->im, $conf); break; case 'WORKAREA': if ($conf['set']) { // this sets the workArea $this->setWorkArea($conf['set']); } if (isset($conf['clear'])) { // This sets the current to the default; $this->workArea = $this->defaultWorkArea; } break; case 'ELLIPSE': $this->makeEllipse($this->im, $conf, $this->workArea); break; } } } } // Preserve alpha transparency if (!$this->saveAlphaLayer) { if ($this->setup['transparentBackground']) { // Auto transparent background is set $Bcolor = ImageColorClosest($this->im, $BGcols[0], $BGcols[1], $BGcols[2]); imagecolortransparent($this->im, $Bcolor); } elseif (is_array($this->setup['transparentColor_array'])) { // Multiple transparent colors are set. This is done via the trick that all transparent colors get // converted to one color and then this one gets set as transparent as png/gif can just have one // transparent color. $Tcolor = $this->unifyColors($this->im, $this->setup['transparentColor_array'], (int) $this->setup['transparentColor.']['closest']); if ($Tcolor >= 0) { imagecolortransparent($this->im, $Tcolor); } } } }
public function frame($light_colour = "FFFFFF", $dark_colour = "000000", $mid_width = 4) { $this->rw = $mid_width; $this->dh = $dark_colour; $this->lh = $light_colour; $this->fr = $this->hex2rgb(substr($this->dh, 0, 2)); $this->fg = $this->hex2rgb(substr($this->dh, 2, 2)); $this->fb = $this->hex2rgb(substr($this->dh, 4, 2)); $this->gr = $this->hex2rgb(substr($this->lh, 0, 2)); $this->gg = $this->hex2rgb(substr($this->lh, 2, 2)); $this->gb = $this->hex2rgb(substr($this->lh, 4, 2)); $this->zen = ImageColorClosest($this->t, $this->gr, $this->gg, $this->gb); $this->nad = ImageColorClosest($this->t, $this->fr, $this->fg, $this->fb); $this->mid = ImageColorClosest($this->t, ($this->gr + $this->fr) / 2, ($this->gg + $this->fg) / 2, ($this->gb + $this->fb) / 2); imageline($this->t, 0, 0, $this->q, 0, $this->zen); imageline($this->t, 0, 0, 0, $this->r, $this->zen); imageline($this->t, $this->q - 1, 0, $this->q - 1, $this->r, $this->nad); imageline($this->t, 0, $this->r - 1, $this->q, $this->r - 1, $this->nad); imageline($this->t, $this->rw + 1, $this->r - ($this->rw + 2), $this->q - ($this->rw + 2), $this->r - ($this->rw + 2), $this->zen); // base in imageline($this->t, $this->q - ($this->rw + 2), $this->rw + 1, $this->q - ($this->rw + 2), $this->r - ($this->rw + 2), $this->zen); // right in imageline($this->t, $this->rw + 1, $this->rw + 1, $this->q - ($this->rw + 1), $this->rw + 1, $this->nad); imageline($this->t, $this->rw + 1, $this->rw + 1, $this->rw + 1, $this->r - ($this->rw + 1), $this->nad); for ($this->crw = 0; $this->crw < $this->rw; $this->crw++) { imageline($this->t, $this->crw + 1, $this->crw + 1, $this->q - ($this->crw + 1), $this->crw + 1, $this->mid); // top imageline($this->t, $this->crw + 1, $this->r - ($this->crw + 2), $this->q - ($this->crw + 1), $this->r - ($this->crw + 2), $this->mid); // base imageline($this->t, $this->crw + 1, $this->crw + 1, $this->crw + 1, $this->r - ($this->crw + 1), $this->mid); //left imageline($this->t, $this->q - ($this->crw + 2), $this->crw, $this->q - ($this->crw + 2), $this->r - ($this->crw + 1), $this->mid); // right } $this->efecto[] = "frame"; }
function ImageResize(&$src, $x, $y) { $dst = imagecreatetruecolor($x, $y); $pals = ImageColorsTotal($src); for ($i = 0; $i < $pals; $i++) { $colors = ImageColorsForIndex($src, $i); ImageColorAllocate($dst, $colors['red'], $colors['green'], $colors['blue']); } $scX = (imagesx($src) - 1) / $x; $scY = (imagesy($src) - 1) / $y; $scX2 = intval($scX / 2); $scY2 = intval($scY / 2); for ($j = 0; $j < $y; $j++) { $sY = intval($j * $scY); $y13 = $sY + $scY2; for ($i = 0; $i < $x; $i++) { $sX = intval($i * $scX); $x34 = $sX + $scX2; $c1 = ImageColorsForIndex($src, ImageColorAt($src, $sX, $y13)); $c2 = ImageColorsForIndex($src, ImageColorAt($src, $sX, $sY)); $c3 = ImageColorsForIndex($src, ImageColorAt($src, $x34, $y13)); $c4 = ImageColorsForIndex($src, ImageColorAt($src, $x34, $sY)); $r = ($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4; $g = ($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4; $b = ($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4; ImageSetPixel($dst, $i, $j, ImageColorClosest($dst, $r, $g, $b)); } } return $dst; }
/** * resizes an image using several different techniques: * * PHP's own ImageCopyResamplated * Bi-linear filter (slower, but better quality than ImageCopyResampled) * Bi-Cubic filter (slowest, but offers the best quality) * PHP's own ImageCopyResized (fastest one, but offers no antialising or filter) * */ function ImageResize($dst_img, &$src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h, $resample = GD_RESIZER_NO_SMOOTHING_MODE) { $pxls = intval($src_w / $dst_w) - 1; if ($resample == GD_RESIZER_PHP_IMAGECOPYRESAMPLED) { imagecopyresampled($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); } elseif ($resample == GD_RESIZER_BILINEAR_MODE) { //slow but better quality ImageTrueColorToPalette($src_img, false, 256); ImagePaletteCopy($dst_img, $src_img); $rX = $src_w / $dst_w; $rY = $src_h / $dst_h; $nY = 0; for ($y = $src_y; $y < $dst_h; $y++) { $oY = $nY; $nY = intval(($y + 1) * $rY + 0.5); $nX = 0; for ($x = $src_x; $x < $dst_w; $x++) { $r = $g = $b = $a = 0; $oX = $nX; $nX = intval(($x + 1) * $rX + 0.5); $c = ImageColorsForIndex($src_img, ImageColorAt($src_img, $nX, $nY)); $r += $c['red']; $g += $c['green']; $b += $c['blue']; $a++; $c = ImageColorsForIndex($src_img, ImageColorAt($src_img, $nX - $pxls, $nY - $pxls)); $r += $c['red']; $g += $c['green']; $b += $c['blue']; $a++; //you can add more pixels here! eg "$nX, $nY-$pxls" or "$nX-$pxls, $nY" ImageSetPixel($dst_img, $x + $dst_x - $src_x, $y + $dst_y - $src_y, ImageColorClosest($dst_img, $r / $a, $g / $a, $b / $a)); } } } elseif ($resample == GD_RESIZER_BICUBIC_MODE) { // veeeeeery slow but better quality ImagePaletteCopy($dst_img, $src_img); $rX = $src_w / $dst_w; $rY = $src_h / $dst_h; $nY = 0; for ($y = $src_y; $y < $dst_h; $y++) { $oY = $nY; $nY = intval(($y + 1) * $rY + 0.5); $nX = 0; for ($x = $src_x; $x < $dst_w; $x++) { $r = $g = $b = $a = 0; $oX = $nX; $nX = intval(($x + 1) * $rX + 0.5); for ($i = $nY; --$i >= $oY;) { for ($j = $nX; --$j >= $oX;) { $c = ImageColorsForIndex($src_img, ImageColorAt($src_img, $j, $i)); $r += $c['red']; $g += $c['green']; $b += $c['blue']; $a++; } } ImageSetPixel($dst_img, $x + $dst_x - $src_x, $y + $dst_y - $src_y, ImageColorClosest($dst_img, $r / $a, $g / $a, $b / $a)); } } } else { $dst_w++; $dst_h++; //->no black border imagecopyresized($dst_img, $src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h); } }
/** * Resample the image * http://www.php.net/manual/en/function.imagecopyresized.php */ protected function resampleBicubic(&$dst, &$src, $dstx, $dsty, $srcx, $srcy, $w, $h, $zoomX, $zoomY = '') { if (!$zoomY) { $zoomY = $zoomX; } $palsize = ImageColorsTotal($src); for ($i = 0; $i < $palsize; $i++) { $colors = ImageColorsForIndex($src, $i); ImageColorAllocate($dst, $colors['red'], $colors['green'], $colors['blue']); } $zoomX2 = (int) ($zoomX / 2); $zoomY2 = (int) ($zoomY / 2); $dstX = imagesx($dst); $dstY = imagesy($dst); $srcX = imagesx($src); $srcY = imagesy($src); for ($j = 0; $j < $h - $dsty; $j++) { $sY = (int) ($j * $zoomY) + $srcy; $y13 = $sY + $zoomY2; $dY = $j + $dsty; if ($sY >= $srcY or $dY >= $dstY or $y13 >= $srcY) { break 1; } for ($i = 0; $i < $w - $dstx; $i++) { $sX = (int) ($i * $zoomX) + $srcx; $x34 = $sX + $zoomX2; $dX = $i + $dstx; if ($sX >= $srcX or $dX >= $dstX or $x34 >= $srcX) { break 1; } $c1 = ImageColorsForIndex($src, ImageColorAt($src, $sX, $y13)); $c2 = ImageColorsForIndex($src, ImageColorAt($src, $sX, $sY)); $c3 = ImageColorsForIndex($src, ImageColorAt($src, $x34, $y13)); $c4 = ImageColorsForIndex($src, ImageColorAt($src, $x34, $sY)); $r = ($c1['red'] + $c2['red'] + $c3['red'] + $c4['red']) / 4; $g = ($c1['green'] + $c2['green'] + $c3['green'] + $c4['green']) / 4; $b = ($c1['blue'] + $c2['blue'] + $c3['blue'] + $c4['blue']) / 4; ImageSetPixel($dst, $dX, $dY, ImageColorClosest($dst, $r, $g, $b)); } } }
/** * function imageCopyResampleBicubic ( * pointer &$dst_img, * pointer &$src_img, * intval $dst_x, * intval $dst_y, * intval $src_x, * intval $src_y, * intval $dst_w, * intval $dst_h, * intval $src_w, * intval $src_h) * * Realiza un remuestreo bicúbico cuando se crea una copia reducida a partir * de otra imagen para mejorar visiblemente la calidad */ function ImageCopyResampleBicubic(&$dst_img, &$src_img, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h) { /** * port to PHP by John Jensen July 10 2001 (updated June 13, 2002 by tim@smoothdeity.com) -- * original code (in C, for the PHP GD Module) by jernberg@fairytale.se * Taken out of http://www.php.net/manual/en/function.imagecopyresized.php */ $scaleX = ($src_w - 1) / $dst_w; $scaleY = ($src_h - 1) / $dst_h; $scaleX2 = (int) ($scaleX / 2); $scaleY2 = (int) ($scaleY / 2); $dstSizeX = imagesx($dst_img); $dstSizeY = imagesy($dst_img); $srcSizeX = imagesx($src_img); $srcSizeY = imagesy($src_img); for ($j = 0; $j < $dst_h - $dst_y; $j++) { $sY = (int) ($j * $scaleY) + $src_y; $y13 = $sY + $scaleY2; $dY = $j + $dst_y; if ($sY > $srcSizeY or $dY > $dstSizeY) { break 1; } for ($i = 0; $i < $dst_w - $dst_x; $i++) { $sX = (int) ($i * $scaleX) + $src_x; $x34 = $sX + $scaleX2; $dX = $i + $dst_x; if ($sX > $srcSizeX or $dX > $dstSizeX) { break 1; } $color1 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $sX, $y13)); $color2 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $sX, $sY)); $color3 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x34, $y13)); $color4 = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x34, $sY)); $red = ($color1['red'] + $color2['red'] + $color3['red'] + $color4['red']) / 4; $green = ($color1['green'] + $color2['green'] + $color3['green'] + $color4['green']) / 4; $blue = ($color1['blue'] + $color2['blue'] + $color3['blue'] + $color4['blue']) / 4; ImageSetPixel($dst_img, $dX, $dY, ImageColorClosest($dst_img, $red, $green, $blue)); } } }
/** * The actual rendering of the image file. * Basically sets the dimensions, the background color, the traverses the array of GIFBUILDER objects and finally setting the transparent color if defined. * Creates a GDlib resource in $this->im and works on that * Called by gifBuild() * * @return void * @access private * @see gifBuild() */ function make() { // Get trivial data $XY = $this->XY; // Gif-start $this->im = imagecreatetruecolor($XY[0], $XY[1]); $this->w = $XY[0]; $this->h = $XY[1]; // backColor is set $BGcols = $this->convertColor($this->setup['backColor']); $Bcolor = ImageColorAllocate($this->im, $BGcols[0], $BGcols[1], $BGcols[2]); ImageFilledRectangle($this->im, 0, 0, $XY[0], $XY[1], $Bcolor); // Traverse the GIFBUILDER objects an render each one: if (is_array($this->setup)) { $sKeyArray = t3lib_TStemplate::sortedKeyList($this->setup); foreach ($sKeyArray as $theKey) { $theValue = $this->setup[$theKey]; if (intval($theKey) && ($conf = $this->setup[$theKey . '.'])) { $isStdWrapped = array(); foreach ($conf as $key => $value) { $parameter = rtrim($key, '.'); if (!$isStdWrapped[$parameter] && isset($conf[$parameter . '.'])) { $conf[$parameter] = $this->cObj->stdWrap($conf[$parameter], $conf[$parameter . '.']); $isStdWrapped[$parameter] = 1; } } switch ($theValue) { // Images case 'IMAGE': if ($conf['mask']) { $this->maskImageOntoImage($this->im, $conf, $this->workArea); } else { $this->copyImageOntoImage($this->im, $conf, $this->workArea); } break; // Text // Text case 'TEXT': if (!$conf['hide']) { if (is_array($conf['shadow.'])) { $isStdWrapped = array(); foreach ($conf['shadow.'] as $key => $value) { $parameter = rtrim($key, '.'); if (!$isStdWrapped[$parameter] && isset($conf[$parameter . '.'])) { $conf['shadow.'][$parameter] = $this->cObj->stdWrap($conf[$parameter], $conf[$parameter . '.']); $isStdWrapped[$parameter] = 1; } } $this->makeShadow($this->im, $conf['shadow.'], $this->workArea, $conf); } if (is_array($conf['emboss.'])) { $isStdWrapped = array(); foreach ($conf['emboss.'] as $key => $value) { $parameter = rtrim($key, '.'); if (!$isStdWrapped[$parameter] && isset($conf[$parameter . '.'])) { $conf['emboss.'][$parameter] = $this->cObj->stdWrap($conf[$parameter], $conf[$parameter . '.']); $isStdWrapped[$parameter] = 1; } } $this->makeEmboss($this->im, $conf['emboss.'], $this->workArea, $conf); } if (is_array($conf['outline.'])) { $isStdWrapped = array(); foreach ($conf['outline.'] as $key => $value) { $parameter = rtrim($key, '.'); if (!$isStdWrapped[$parameter] && isset($conf[$parameter . '.'])) { $conf['outline.'][$parameter] = $this->cObj->stdWrap($conf[$parameter], $conf[$parameter . '.']); $isStdWrapped[$parameter] = 1; } } $this->makeOutline($this->im, $conf['outline.'], $this->workArea, $conf); } $conf['imgMap'] = 1; $this->makeText($this->im, $conf, $this->workArea); } break; // Text effects: // Text effects: case 'OUTLINE': if ($this->setup[$conf['textObjNum']] == 'TEXT' && ($txtConf = $this->checkTextObj($this->setup[$conf['textObjNum'] . '.']))) { $this->makeOutline($this->im, $conf, $this->workArea, $txtConf); } break; case 'EMBOSS': if ($this->setup[$conf['textObjNum']] == 'TEXT' && ($txtConf = $this->checkTextObj($this->setup[$conf['textObjNum'] . '.']))) { $this->makeEmboss($this->im, $conf, $this->workArea, $txtConf); } break; case 'SHADOW': if ($this->setup[$conf['textObjNum']] == 'TEXT' && ($txtConf = $this->checkTextObj($this->setup[$conf['textObjNum'] . '.']))) { $this->makeShadow($this->im, $conf, $this->workArea, $txtConf); } break; // Other // Other case 'BOX': $this->makeBox($this->im, $conf, $this->workArea); break; case 'EFFECT': $this->makeEffect($this->im, $conf); break; case 'ADJUST': $this->adjust($this->im, $conf); break; case 'CROP': $this->crop($this->im, $conf); break; case 'SCALE': $this->scale($this->im, $conf); break; case 'WORKAREA': if ($conf['set']) { $this->setWorkArea($conf['set']); // this sets the workArea } if (isset($conf['clear'])) { $this->workArea = $this->defaultWorkArea; // this sets the current to the default; } break; case 'ELLIPSE': $this->makeEllipse($this->im, $conf, $this->workArea); break; } } } } if ($this->setup['transparentBackground']) { // Auto transparent background is set $Bcolor = ImageColorClosest($this->im, $BGcols[0], $BGcols[1], $BGcols[2]); imagecolortransparent($this->im, $Bcolor); } elseif (is_array($this->setup['transparentColor_array'])) { // Multiple transparent colors are set. This is done via the trick that all transparent colors get converted to one color and then this one gets set as transparent as png/gif can just have one transparent color. $Tcolor = $this->unifyColors($this->im, $this->setup['transparentColor_array'], intval($this->setup['transparentColor.']['closest'])); if ($Tcolor >= 0) { imagecolortransparent($this->im, $Tcolor); } } }