How to make circled thumbnails using GD - php

I would like to make a circled thumbnails using GD library. Is there're any ready solutions for this? I've seen libraries only for rounded corners yet.

Here is the script i use. It just overlays my thumbnail with a half-transparent pattern, which makes the thumbnail with some shape effect.
ini_set("memory_limit","64M");
ini_set("gd.jpeg_ignore_warning", 1);
$img_name=$_GET[f];
$type=$_GET[type];
if (isset($img_name)) {
$img_name = $_SERVER["DOCUMENT_ROOT"]."/catalog/".$img_name;
$info = #getimagesize($img_name);
$ext = #$info[2];
$header = #$info['mime'];
$board = ImageCreateFrompng("images/item".$type.".png");
$im = ImageCreateTrueColor(170,140);
$bg = imagecolorallocate($im, 255, 255, 255);
imagefill($im,0,0,$bg);
header("Content-type: $header");
switch($ext) {
case 1: { // GIF
$img = #imagecreatefromgif($img_name);
if ($img) {
imagecopyresized($im, $img, (170-$info[0]), 0, 0, 0, #$info[0], #$info[1], #$info[0], #$info[1]);
imagecopy($im, $board, 0, 0, 0, 0, 170, 140);
imagegif($im, '', 100);
return $chache_fn;
} break;
}
case 2: { // JPG
$img = #imagecreatefromjpeg($img_name);
if ($img) {
imagecopyresized($im, $img, (170-$info[0]), 0, 0, 0, #$info[0], #$info[1], #$info[0], #$info[1]);
imagecopy($im, $board, 0, 0, 0, 0, 170, 140);
imagejpeg($im, '', 100);
} break;
}
case 3: { // PNG
$img = #imagecreatefrompng($img_name);
if ($img) {
imagecopyresized($im, $img, (170-$info[0]), 0, 0, 0, #$info[0], #$info[1], #$info[0], #$info[1]);
imagecopy($im, $board, 0, 0, 0, 0, 170, 140);
imagepng($im, '', 9);
} break;
}
case 6: { // BMP
$img = #imagecreatefromwbmp($img_name);
if ($img) {
imagecopyresized($im, $img, (170-$info[0]), 0, 0, 0, #$info[0], #$info[1], #$info[0], #$info[1]);
imagecopy($im, $board, 0, 0, 0, 0, 170, 140);
imagewbmp($im, '', 100);
} break;
}
}
}

Related

Image GD Resizing Issue

So I'm trying to take two large images (but later I'll be combinging 6 images in total), resize them to the x, y width, height I have taken from photoshop, and combine them into one 460 x 230 sized image.
This is the code I'm using
<?php
$dest = imagecreatefrompng('https://blzgdapipro-a.akamaihd.net/hero/ana/career-portrait.png');
$src = imagecreatefrompng('https://blzgdapipro-a.akamaihd.net/game/rank-icons/season-2/rank-6.png');
imagealphablending($dest, false);
imagesavealpha($dest, true);
imagealphablending($src, false);
imagesavealpha($src, true);
//imagescale($dest, 396, 161.92);
$some = imagecreate(460, 230);
$dest2 = resize($dest, 396, 162);
$src2 = resize($src, 79.19, 79.19);
//imagecopyresized($dest, $dest, 0, 0, 0, 0, 396, 161.92, 1098, 449);
imagecopyresized($src, $src, 10, 10, 0, 0, 79.19, 79.19, 256, 256);
//$img2 = imagecopymerge($dest, $src, 0, 0, 0, 0, 256, 256, 100); //have to play with these numbers for it to work for you, etc.
imagecopymerge($dest2, $src2, 0, 0, 0, 0, 460, 230, 50);
header('Content-Type: image/png');
imagepng($dest, 'merged2.png');
imagepng($dest2);
//file_put_contents('merged.png', $contents);
imagedestroy($dest);
imagedestroy($src);
imagedestroy($some);
imagedestroy($dest2);
imagedestroy($src2);
imagedestroy($img2);
//imagedestroy($then);
function resize($img, $width, $height, $stretch = false)
{
$temp = imagecreatetruecolor($width, $height);
imagealphablending($temp, true);
imagesavealpha($temp, true);
$bg = imagecolorallocatealpha($temp, 0, 0, 0, 0); // Background color
imagefill($temp, 0, 0, $bg);
if ($stretch)
{
imagecopyresampled($temp, img, 0, 0, 0, 0, $width, $height, imagesx($img), imagesy($img));
}
else
{
if (imagesx($img) <= $width && imagesy($img) <= $height)
{
$fwidth = imagesx($img);
$fheight = imagesy($img);
}
else
{
$wscale = $width / imagesx($img);
$hscale = $height / imagesy($img);
$scale = min($wscale, $hscale);
$fwidth = $scale * imagesx($img);
$fheight = $scale * imagesy($img);
}
imagecopyresampled($temp,
$img,
($width - $fwidth) / 2, ($height - $fheight) / 2,
0, 0,
$fwidth, $fheight,
imagesx($img), imagesy($img)
);
}
return $temp;
}
The issue is that the image rendered is very faded
because of this line:
imagecopymerge($dest2, $src2, 0, 0, 0, 0, 460, 230, 50);
If I change the 50, which is the PCT value to 100, it shows one image with a black background (masking the other image), but if I change it to 0, it shows only the other image with a black background (masking the other image)
If the value is either 0 or 100, the image shown is at its full color though. How do I merge these 2 images together while preserving their transparency and vibrancy of color?
Instead of imagecopymerge use imagecopy. You also always need to correctly specify the dimensions of the source image when copying:
$dest = imagecreatefrompng('https://blzgdapipro-a.akamaihd.net/hero/ana/career-portrait.png');
$src = imagecreatefrompng('https://blzgdapipro-a.akamaihd.net/game/rank-icons/season-2/rank-6.png');
$dest2 = resize($dest, 396, 162);
imagedestroy($dest);
$src2 = resize($src, 79, 79); // should be int not float.
imagedestroy($src);
// the last 2 params must match the width/height of the $src2 image.
imagecopy($dest2, $src2, 0, 0, 0, 0, 79, 79);
imagedestroy($src2);
header('Content-Type: image/png');
imagepng($dest2);
imagedestroy($dest2);
You don't need to change the alpha settings on $dest or $src because they aren't being rendered - you render the new image resource created in, and returned by, your resize function. Because of this you do need to slightly change the function:
function resize($img, $width, $height, $stretch = false)
{
$temp = imagecreatetruecolor($width, $height);
imagealphablending($temp, false); // changed to false.
imagesavealpha($temp, true);
...
Edit:
You might be better off simply using the imagescale function instead of using your own resize function:
$dest = imagecreatefrompng('https://blzgdapipro-a.akamaihd.net/hero/ana/career-portrait.png');
$src = imagecreatefrompng('https://blzgdapipro-a.akamaihd.net/game/rank-icons/season-2/rank-6.png');
$dest2 = imagescale($dest, 396);
imagealphablending($dest2, false);
imagesavealpha($dest2, true);
$src2 = imagescale($src, 79);
imagecopy($dest2, $src2, 0, 0, 0, 0, 79, 79);
header('Content-Type: image/png');
imagepng($dest2);
imagedestroy($dest);
imagedestroy($src);
imagedestroy($dest2);
imagedestroy($src2);

php imagerotate and imagecopymerge makes no transparent background and no auto width/height

I have this script, which makes an image and posts it on another image:
<?php
$img=imagecreatetruecolor(150,20);
imagealphablending($img,false);
$col=imagecolorallocatealpha($img,255,255,255,127);
$black = imagecolorallocate($img, 0, 0, 0);
imagecolortransparent($img, $black);
imagefilledrectangle($img,0,0,180,20,$col);
imagealphablending($img,true);
$font='../ttf/0001.ttf';
$color = imagecolorallocate($img, 0, 0, 0);
imagettftext($img,11,0,5,14,$color,$font,'Text goes here');
imagealphablending($img,false);
imagesavealpha($img,true);
imagejpeg($img, '../custom_images/test.jpg');
// Create image instances
$dest = imagecreatefromjpeg('../custom_images/121536.jpg');
$src = imagecreatefromjpeg('../custom_images/test.jpg');
$width = imagesx($src);
$height = imagesy($src);
imageantialias($src, true);
$color = imagecolorallocatealpha($src, 0, 0, 0, 127);
$rotated = imagerotate($src, 0, $color);
imagesavealpha($rotated, true);
$trans_colour = imagecolorallocatealpha($rotated, 0, 0, 0, 127);
imagefill($rotated, 0, 0, $trans_colour);
imagepng($rotated, 'shahid.png');
$new_img = imagecreatefrompng('shahid.png');
$width = imagesx($new_img);
$height = imagesy($new_img);
// imagecopymerge($dest, $new_img, 50, 50, 0, 0, $width+60, $height+60, 100);
imagecopymerge_alpha($dest, $new_img, 0, 20, 0, 0, $width, $height, 100);
// Output and free from memory
header('Content-Type: image/png');
imagepng($dest);
imagedestroy($dest);
imagedestroy($src);
?>
2 things:
Background is not transparent
I want the Width and Height to be automatic, so if the text is short, the image is it to.
What do I fault?

PHP watermark cannot upload png

my script it work with jpg , jpeg , bmp when i upload and succsess.
but when i upload png , gif it stored in my folder but the image is blank with black background color.
is there any way to solve this?
$water_mark_text_2 = "text";
$font_path = "fonts/BRLNSR.TTF";
$font_size = 25; // in pixcels
//$water_mark_text_1 = "9";
function watermark_text($oldimage_name, $new_image_name){
global $font_path, $font_size, $water_mark_text_1, $water_mark_text_2;
list($width,$height) = getimagesize($oldimage_name);
$image = imagecreate(100, 100);
// sets some colors
$white = imagecolorallocate($image, 255, 255, 255);
$black = imagecolorallocate($image, 0, 0, 0);
$image = imagecreatetruecolor($width, $height);
$image_src = imagecreatefromjpeg($oldimage_name);
imagecopyresampled($image, $image_src, 0, 0, 0, 0, $width, $height, $width, $height);
//imagecopyresampled($image, $stamp, $image_src, 0, 0, 0, 0, $width, $height, $width, $height , imagesx($stamp), imagesy($stamp), 60);
// $black = imagecolorallocate($image, 0, 0, 0);
$blue = imagecolorallocate($image, 79, 166, 185);
// imagettftext($image, $font_size, 0, 30, 190, $black, $font_path, $water_mark_text_1);
imagettftext($image, $font_size, 0, 5, 20, $white, $font_path, $water_mark_text_2);
imagejpeg($image, $new_image_name, 100);
imagedestroy($image);
unlink($oldimage_name);
return true;
}
$path = "$stored/";
$valid_formats = array("jpg", "bmp","jpeg","JPG","png");
$name = $_FILES['img']['name'];
list($txt, $ext) = explode(".", $name);
$upload_status = move_uploaded_file($_FILES['img']['tmp_name'],$path.$name);
$new_name = $stored.$md5_img.".jpg";
watermark_text($path.$_FILES['img']['name'], $new_name);
if i change imagecreatefromjpeg to imagecreatefrompng , and imagejpg to imagepng.
the image still upload , but i cannot opened.

Imagestring align to the right

I want to align the watermark of an image to the right side.
This is what I have so far but its aligned to the left...
// Add Watermark featuring Website Name
$home_url = home_url();
$search = array('http://','https://');
$site_name = str_ireplace($search, '', $home_url);
$watermark = imagecreatetruecolor($width, $height+15);
// Determine color of watermark's background
if (is_array($Meme_Generator_Data) &&
array_key_exists('watermark_background',$Meme_Generator_Data) &&
strlen($Meme_Generator_Data['watermark_background']) == 7)
{
$wm_bg = $this->convert_color(substr($Meme_Generator_Data['watermark_background'], 1));
$bg_color = imagecolorallocate($watermark, $wm_bg[0], $wm_bg[1], $wm_bg[2]);
imagefill($watermark, 0, 0, $bg_color);
}
// Determine color of watermark's text
if (is_array($Meme_Generator_Data) &&
array_key_exists('watermark_text',$Meme_Generator_Data) &&
strlen($Meme_Generator_Data['watermark_text']) == 7)
{
$wm_text = $this->convert_color(substr($Meme_Generator_Data['watermark_text'], 1));
$text_color = imagecolorallocate($watermark, $wm_text[0], $wm_text[1], $wm_text[2]);
} else {
$text_color = imagecolorallocate($watermark, 255, 255, 255);
}
imagestring($watermark, 5, 5, $height, $site_name, $text_color);
imagecopy($watermark, $img, 0, 0, 0, 0, $width, $height);
$img = $watermark;
Replace
imagecopy($watermark, $img, 0, 0, 0, 0, $width, $height);
with
imagecopy($watermark, $img, imagesx($img) - $width, 0, 0, 0, $width, $height);

PHP GD imagecolorallocatealpha only makes grey text

Is there any reason why imagecolorallocatealpha() would only be making the text grey?
<?php
header('Content-Type: image/png');
function checkImg($imgname) {
$im = #imagecreatefrompng($imgname);
if(!$im) {
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
}
return $im;
}
$hr = 48;
$tOne = "VALID FOR";
$tTwo = $hr." HOURS";
$img = checkImg('img.png');
$font = 'helr67w.ttf';
$size = 9;
$red = imagecolorallocatealpha($img, 255, 0, 0, 75);
imagettftext($img, $size, 0, 225, 132, $red, $font, $tOne);
imagettftext($img, $size, 0, 225, 144, $red, $font, $tTwo);
imagepng($img);
imagedestroy($img);
?>
In your code you don't set the image to support an alpha channel. I can imagine that is causing the issue:
function checkImg($imgname) {
$im = #imagecreatefrompng($imgname);
if(!$im) {
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
}
// Turn off alpha blending and set alpha flag
imagealphablending($im, true);
imagesavealpha($im, true);
return $im;
}
See imagesavealpha PHP Manual and imagealphablending PHP Manual

Categories