Bevel And Emboss for auto generated card image - php

i've been working on a auto-generated card for member system.
the card made by PHPGD image system.
this is the code :
<?php
include_once('php_includes/check_login_status_member.php');
if ($user_ok == false ){
exit();
}
$sql = "SELECT * FROM members WHERE id_member='$log_id' LIMIT 1";
$query = mysqli_query($db_conx, $sql);
while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
$id_komunitas = $row['id_komunitas'];
$id_card = $row['id_card'];
$nama_lengkap = $row['nama_lengkap'];
$id_member = $row['id_member'];
$avatar = $row['avatar'];
$profile_pic = $avatar;
if($avatar == NULL){
$profile_pic = 'avatar-1-256.png';
}
}
if (isset($_GET['id'])){
$id = preg_replace('#[^0-9]#', '', $_GET['id']);
if (empty($id)) {
$id = $id_card;
}
}
else {
$id = $id_card;
}
$sqlcard = "SELECT * FROM card WHERE id_card='$id' LIMIT 1";
$querycard = mysqli_query($db_conx, $sqlcard);
while ($rowcard = mysqli_fetch_array($querycard, MYSQLI_ASSOC)) {
$background = $rowcard['image'];
// $background = "cardbranch/bg.png";
}
$nol = str_pad($id_member, 7, "0", STR_PAD_LEFT);
$detail = pathinfo($background);
$detail2 = pathinfo($avatar);
if ($detail['extension'] == 'png'){
$img = imagecreatefrompng('assets/img/card/background/'.$background.'');
} else if ($detail['extension'] == 'jpg' || $detail['extension'] == 'jpeg') {
$img = imagecreatefromjpeg('assets/img/card/background/'.$background.'');
}
// if ($detail['extension'] == 'png'){
// $img = imagecreatefrompng($background);
// } else if ($detail['extension'] == 'jpg' || $detail['extension'] == 'jpeg') {
// $img = imagecreatefromjpeg($background);
// }
if($avatar == NULL){
$eclipse = imagecreatefrompng('assets/img/'.$profile_pic.'');
$mask = imagecreatetruecolor(256, 256);
$black = imagecolorallocate($mask, 0, 0, 0);
$magenta = imagecolorallocate($mask, 255, 0, 255);
imagefill($mask, 0, 0, $magenta);
imagefilledellipse(
$mask,
(256 / 2),
(256 / 2),
256,
256,
$black
);
imagecolortransparent($mask, $black);
imagecolortransparent($eclipse, $magenta);
imagecopymerge($eclipse, $mask, 0, 0, 0, 0, 256, 256, 100);
imagedestroy($mask);
} else {
if ($detail2['extension'] == 'jpg' || $detail2['extension'] == 'jpeg'){
$eclipsex = imagecreatefromjpeg('assets/img/user/profilepicture/'.$profile_pic);
$eclipse = imagescale($eclipsex, 172, 172);
} else if ($detail2['extension'] == 'png') {
$eclipsex = imagecreatefrompng('assets/img/user/profilepicture/'.$profile_pic);
$eclipse = imagescale($eclipsex, 172, 172);
}
$mask = imagecreatetruecolor(172, 172);
$black = imagecolorallocate($mask, 0, 0, 0);
$magenta = imagecolorallocate($mask, 255, 0, 255);
imagefill($mask, 0, 0, $magenta);
imagefilledellipse(
$mask,
(168 / 2),
(168 / 2),
168,
168,
$black
);
imagecolortransparent($mask, $black);
imagecolortransparent($eclipse, $magenta);
imagecopymerge($eclipse, $mask, 0, 0, 0, 0, 172, 172, 100);
imagedestroy($mask);
}
// $barisputih = imagecreatefrompng('assets/img/card/placeholder/barisputih.png');
// $barisbiru = imagecreatefrompng('assets/img/card/placeholder/barisbiru.png');
$layernama = imagecreatefrompng('cardbranch/layernama2.png');
$layertipe = imagecreatefrompng('cardbranch/layertipe2.png');
$shapeatas = imagecreatefrompng('cardbranch/shapeatas.png');
$shapebawah = imagecreatefrompng('cardbranch/shapebawah.png');
$layernomor = imagecreatefrompng('cardbranch/layernomor.png');
// $rec = imagecreatefrompng('cardbranch/rec.png');
$bisnisabah = imagecreatefrompng('cardbranch/x.png');
$putih = imagecolorallocate( $img, 255, 255, 255 );
imagealphablending($img, true);
imagesavealpha($img, true);
imageantialias($eclipse, true);
imagecopymerge($img, $layernama, 162, 51, 0, 0, 762, 69, 50);
imagecopymerge($img, $layertipe, 122, 131, 0, 0, 728, 54, 50);
imagecopymerge($img, $shapeatas, 153, 51, 0, 0, 770, 5, 100);
imagecopymerge($img, $shapebawah, 126, 131, 0, 0, 724, 4, 100);
imagecopymerge($img, $layernomor, 0, 335, 0, 0, 1050, 90, 50);
imagecopymerge($img, $bisnisabah, 783, 463, 0, 0, 266, 142, 60);
// imagecopymerge($img, $rec, 0, 335, 0, 0, 1050, 90, 50);
imagecopymerge($img, $eclipse, 33, 36, 0, 0, 172, 172, 100);
imagettftext($img, 34, 0, 234, 105, $putih, 'assets/img/card/font/norwester.otf', $nama_lengkap);
imagettftext($img, 23, 0, 234, 172, $putih, 'assets/img/card/font/norwester.otf', "Personal Member");
imagettftext($img, 45, 0, 110, 403, $putih, 'assets/img/card/font/norwester.otf', "01.04.2010 - ".$nol);
header('Content-Type: image/jpeg');
imagepng( $img );
imagecolordeallocate( $color );
imagedestroy( $img );
?>
and this is how the image look like in the webpage : webpagescreenshot
and the problem is, i wanna add bevel and emboss to the image and also a border radius around 20px or something , and of course we could do that with css
but when the user download the image , the style of course will be gone. i've been trying lookin for canvas option to make bevel and emboss looks realistic like photoshop bevel and emboss , and this is the image i want to achieve : this one made by photoshop
so when they download the image they will get image with border radius and bevel as well ,so is there is a way to do this image effect with phpgd or canvas?, thanks for your help. and sorry for my bad english.

Related

PHP GD - image damaged when using imagettftext()

I'am using PHP 7.4, with Symfony 5.2, memory_limit = 1024M in php.ini
I implement an API which put a quote in an image, using imagettftext() method.
My problem is that the image is damaged. It seems to be because of the length of the text.
When the text is short, the result is ok:
image ok
When the text is longer, the image is damaged (color spots appear):
image damaged
Here is my code:
private function createResource(string $imageContent, array $quote)
{
$image = \imagecreatefromstring($imageContent);
$heigh = \imagesy($image);
$width = \imagesx($image);
$text = $quote['quote'];
$charsArray = \str_split($text, 1);
$charsTotalNb = \count($charsArray);
$charsNbPerLine = (int) floor(($width - 50) / 10);
$lineNb = (int) ceil($charsTotalNb / $charsNbPerLine);
$text = \wordwrap($text, $charsNbPerLine, "|", \false);
$quoteHeigh = 60 + $lineNb * 25;
$card = \imagecreatetruecolor($width, $heigh + $quoteHeigh);
$black = \imagecolorallocate($card, 0, 0, 0);
$white = imagecolorallocate($card, 255, 255, 255);
\imagefill($card, 0, 0, $black);
\imagecopymerge($card, $image, 0, 0, 0, 0, $width, $heigh, $quoteHeigh);
\imagedestroy($image);
$font = __DIR__ . '/../../public/fonts/Averia_Serif_Libre.ttf';
\imagettftext($card, 15, 0, 25, $heigh + 30, $white, $font, $text);
$author = $quote['author'];
if (empty($author)) {
$author = 'Anonymous';
}
\imagettftext(
$card,
12,
0,
(int) $width/2,
$heigh + 40 + $lineNb * 25,
$white,
$font,
'-' . $author . '-'
);
for ($i = 0 ; $i < 7 ; $i++ ) {
\imageline($card, 0 + $i, 0 + $i, 0 + $i , \imagesy($card), $black);
\imageline($card, 0, 0 + $i, \imagesx($card) , 0 + $i, $black);
\imageline($card, \imagesx($card) - $i, 0, \imagesx($card) - $i, \imagesy($card), $black);
}
if (empty(\get_resource_type($card))) {
throw new Exception("Error Processing Request in CardService::createCard()");
}
return $card;
}
How fix my problem ? How to remedy the deterioration of the cat's image?
Thanks for your answers.
I found the problem in my code :
The following line is wrong because of the last argument :
\imagecopymerge($card, $image, 0, 0, 0, 0, $width, $heigh, $quoteHeigh);
The correction is :
\imagecopymerge($card, $image, 0, 0, 0, 0, $width, $heigh, 100);
```

Code is not working getting error

Getting error message :
cannot be displayed because it contains some error.
<?php
include("connection.php");
$height = 200;
$width = 200;
$border = 30;
if($_GET['height']) {$height = $_GET['height'];}
if($_GET['width']) {$width = $_GET['width'];}
if($_GET['border']) {$border = $_GET['border'];}
Header('Content-type: image/jpeg');
$image = ImageCreate($width+$border, $height+$border);
$white = ImageColorAllocate($image, 255, 255, 255);
$black = ImageColorAllocate($image, 0, 0, 0);
$blueish = ImageColorAllocate($image, 120, 120, 255);
$redish = ImageColorAllocate($image, 222, 66, 66);
$grayish = ImageColorAllocate($image, 200, 200, 200);
$purpleish = ImageColorAllocate($image, 200, 10, 200);
ImageFill($image, 0,0, $black);
ImageFilledRectangle ($image, 0,0,$border,$height+$border, $grayish);
ImageFilledRectangle ($image, 0,$height, $border+$height,$border+$width, $grayish);
$sql = "SELECT Battery FROM battery_level ORDER BY DESC";
$result = mysqli_query( $sql, $conn );
$num = mysqli_num_rows($result);
$den = $num*2+1;
$xspacing = intval($width/$den);
$pos = -1;
while ($row = mysqli_fetch_array($result))
{
$pos = $pos +2;
$left = $pos*$xspacing;
$right = ($pos+1)*$xspacing;
}
ImageJpeg($image);
ImageDestroy($image);
?>
Try this
ImageJpeg($image, $path); //ex. $path = 'asset/image_name.jpg'
you did not specify path of this file.
I think Header('Content-type: image/jpeg'); is problem.

imagecopyresampled after rotating the image

I am trying to copy image (to $img) after rotating image (many images $im) but I get weird behavior. Once I un-comment the line //$img = I only get the rotated image on my final output. Can I rotate the inner $im and copy it to final image$img?
<?php
$height = 80;
$width = 300;
$img = imagecreate($width, $height);
$c = imagecolorallocate ($img , 135, 135, 135);
imagefill($img, 0, 0, imagecolorallocate($img, 255, 255, 255));
for($i=0; $i<=5; $i++){
$im = imagecreatetruecolor(35, 35);
$gry = imagecolorallocate($im, 135, 135, 135);
$wht = imagecolorallocate($im, 255, 255, 255);
$j = mt_rand(0, 1);
$ch = mt_rand(0,1)?chr(rand(65, 90)):chr(rand(97, 122));
if($j == 0){
imagefill($im, 0, 0, $wht);
imagefttext($im, 20, 0, 3, 21, $gry, 'AHGBold.ttf', $ch);
//$img = imagerotate($im, mt_rand(0,10)-5, $wht);
}else{
imagefill($im, 0, 0, $gry);
imagefttext($im, 20, 0, 3, 21, $wht, 'AHGBold.ttf', $ch);
//$img = imagerotate($im, mt_rand(0,10)-5, $gry);
}
imagecopyresampled($img, $im, 5 + $i*42, $height/2 - 12, 0, 0, 40, 40, 25, 25);
}
header('Content-type: image/png');
imagepng($img);
change
$img = imagerotate($im, mt_rand(0,10)-5, $wht);
and
$img = imagerotate($im, mt_rand(0,10)-5, $gry);
to
$im = imagerotate($im, mt_rand(0,10)-5, $wht);
and
$im = imagerotate($im, mt_rand(0,10)-5, $gry);
in cases that imagerotes does not work you can use the following function to rotate an image:
function imagerotateEquivalent(&$srcImg, $angle, $bgcolor, $ignore_transparent = 0)
{
$srcw = imagesx($srcImg);
$srch = imagesy($srcImg);
if($angle == 0) return $srcImg;
// Convert the angle to radians
$theta = deg2rad ($angle);
// Calculate the width of the destination image.
$temp = array ( rotateX(0, 0, 0-$theta),
rotateX($srcw, 0, 0-$theta),
rotateX(0, $srch, 0-$theta),
rotateX($srcw, $srch, 0-$theta)
);
$minX = floor(min($temp));
$maxX = ceil(max($temp));
$width = $maxX - $minX;
// Calculate the height of the destination image.
$temp = array ( rotateY(0, 0, 0-$theta),
rotateY($srcw, 0, 0-$theta),
rotateY(0, $srch, 0-$theta),
rotateY($srcw, $srch, 0-$theta)
);
$minY = floor(min($temp));
$maxY = ceil(max($temp));
$height = $maxY - $minY;
$destimg = imagecreatetruecolor($width, $height);
imagefill($destimg, 0, 0, imagecolorallocate($destimg, 0,255, 0));
// sets all pixels in the new image
for($x=$minX;$x<$maxX;$x++) {
for($y=$minY;$y<$maxY;$y++)
{
// fetch corresponding pixel from the source image
$srcX = round(rotateX($x, $y, $theta));
$srcY = round(rotateY($x, $y, $theta));
if($srcX >= 0 && $srcX < $srcw && $srcY >= 0 && $srcY < $srch)
{
$color = imagecolorat($srcImg, $srcX, $srcY );
}
else
{
$color = $bgcolor;
}
imagesetpixel($destimg, $x-$minX, $y-$minY, $color);
}
}
return $destimg;
}
function rotateX($x, $y, $theta){
return $x * cos($theta) - $y * sin($theta);
}
function rotateY($x, $y, $theta){
return $x * sin($theta) + $y * cos($theta);
}
I got the above code from a note in php.net

Trying to add text into an image

I'm trying to add 2 line of text. One for the name of the person and the other for the name of the clan.
Could you help me of what I'm doing wrong? I don't get any error message or anything and the image is loading fine.
This is my code:
//Ribbons Image
$ribbons = array(
"ribbons/1STAID.png",
"ribbons/BMT.png",
"ribbons/BRA1A.png",
"ribbons/CCMD.png",
"ribbons/CCMDV2.png",
"ribbons/donator.png",
"ribbons/FTR.png",
"ribbons/GC.png",
"ribbons/GRA1A.png",
"ribbons/IOTP.png",
"ribbons/MEDIC.png",
"ribbons/PHA1A.png",
"ribbons/PILOT.png",
"ribbons/RCT1A.png",
"ribbons/RCT2A.png",
"ribbons/RCT3A.png",
"ribbons/RCT4A.png",
"ribbons/SRA1A.png",
"ribbons/SVR1A.png",
"ribbons/SVR2A.png",
"ribbons/SVR3A.png",
"ribbons/SVR4A.png",
"ribbons/SVR-ALTIS.png",
"ribbons/XOCMD.png",
"ribbons/XOCMDV2.png");
//Rank Image
$rank = imagecreatefrompng("rank/2LT.png");
//Background
$frame = imagecreatefrompng("sign3.png");
//imagecopymergy(output,image,x,y,0,0,w,h,100)
//Adding rank
imagecopymerge($frame, $rank, 30, 30, 0, 0, 10, 25, 100);
//Trying to add the text on the image
$im = imagecreatetruecolor(400, 30);
$white = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $white);
$text = 'Test...';
$font = 'arial.ttf';
imagettftext($im, 20, 0, 10, 20, $white, $font, $text);
//Adding the ribbon on the image
$z = 0;
$i = 0;
for ($y = 0; $y <= 120; $y += 20) {
$z++;
for ($x = 0; $x <= 150; $x += 50) {
if ($i <= 24) {
$rib = imagecreatefromjpeg($ribbons[$i]);
imagecopymerge($frame, $rib, $x + 375, $y + 50, 0, 0, 50, 20, 100);
}
$i++;
}
}
//Save the image + Display
imagepng($frame, 'generate/test.png');
imagepng($frame);
header('Content-Type: image/png');
Thanks for helping me!
Working code:
//Ribbons Image
$ribbons = array(
"ribbons/1STAID.png",
"ribbons/BMT.png",
"ribbons/BRA1A.png",
"ribbons/CCMD.png",
"ribbons/CCMDV2.png",
"ribbons/donator.png",
"ribbons/FTR.png",
"ribbons/GC.png",
"ribbons/GRA1A.png",
"ribbons/IOTP.png",
"ribbons/MEDIC.png",
"ribbons/PHA1A.png",
"ribbons/PILOT.png",
"ribbons/RCT1A.png",
"ribbons/RCT2A.png",
"ribbons/RCT3A.png",
"ribbons/RCT4A.png",
"ribbons/SRA1A.png",
"ribbons/SVR1A.png",
"ribbons/SVR2A.png",
"ribbons/SVR3A.png",
"ribbons/SVR4A.png",
"ribbons/SVR-ALTIS.png",
"ribbons/XOCMD.png",
"ribbons/XOCMDV2.png");
//Rank Image
$rank = imagecreatefrompng("rank/2LT.png");
//Background
$frame = imagecreatefrompng("sign3.png");
//imagecopymergy(output,image,x,y,0,0,w,h,100)
//Adding rank
imagecopymerge($frame, $rank, 30, 30, 0, 0, 10, 25, 100);
//Trying to add the text on the image
$im = imagecreatetruecolor(50, 30);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 0, 82, 255);
imagefilledrectangle($im, 4, 4, 50, 25, $white);
$text = 'Nato Military Corp';
$font = 'arial.ttf';
imagettftext($frame, 12, 0, 450, 220, $white, $font, $text);
//imagecopymerge($frame, $im, 10, 20, 0, 0, 10, 25, 100);
//Adding the ribbon on the image
$z = 0;
$i = 0;
for ($y = 0; $y <= 120; $y += 20) {
$z++;
for ($x = 0; $x <= 150; $x += 50) {
if ($i <= 24) {
$rib = imagecreatefromjpeg($ribbons[$i]);
imagecopymerge($frame, $rib, $x + 375, $y + 50, 0, 0, 50, 20, 100);
}
$i++;
}
}
//Save the image + Display
imagepng($frame, 'generate/test.png');
imagepng($frame);
header('Content-Type: image/png');

How to create transparent background with PHP using GD?

I made an image combining 3 different images, but I need a transparent background, and I don't succeed doing it. This is my final code:
<?php
$meko = $_GET['image'];
$im = $meko;
$bookback = "images/book_back.png";
$mekoCanvas = imagecreatetruecolor(115, 135);
$canvas = imagecreatetruecolor(115, 185);
$bookback = imagecreatefrompng($bookback);
$meko = imagecreatefromjpeg($meko);
imagecopy($mekoCanvas, $meko, 0, 0, 0, 0, 100, 135);
imagecopy($mekoCanvas, $bookback, 100, 0, 0, 0, 15, 135);
$im = $mekoCanvas;
$rH = 50; // Reflection height
$tr = 30; // Starting transparency
$div = 1; // Size of the divider line
$w = 115;
$h = 135;
//$im = imagecreatefromjpeg($im);
$li = imagecreatetruecolor($w, 1);
$bgc = imagecolorallocate($li, 255, 255, 255); // Background color
imagefilledrectangle($li, 0, 0, $w, 1, $bgc);
$bg = imagecreatetruecolor($w, $rH);
$wh = imagecolorallocate($im,255,255,255);
$im = imagerotate($im, -180, $wh);
imagecopyresampled($bg, $im, 0, 0, 0, 0, $w, $h, $w, $h);
$im = $bg;
$bg = imagecreatetruecolor($w, $rH);
for ($x = 0; $x < $w; $x++) {
imagecopy($bg, $im, $x, 0, $w-$x, 0, 1, $rH);
}
$im = $bg;
$in = 100/$rH;
for($i=0; $i<=$rH; $i++){
if($tr>100) $tr = 100;
imagecopymerge($im, $li, 0, $i, 0, 0, $w, 1, $tr);
$tr+=$in;
}
imagecopymerge($im, $li, 0, 0, 0, 0, $w, $div, 100); // Divider
header('content-type: image/jpeg');
imagecopy($canvas, $mekoCanvas, 0, 0, 0, 0, 115, 135);
imagecopy($canvas, $im, 0, 135, 0, 0, 115, 50);
imagejpeg($canvas);
imagedestroy($im);
imagedestroy($li);
?>
and the results is:
click here
You're not telling GD to use alpha in any of your code. That's done with imagesavealpha, imagealphablending, etc...
Try using
imagecolortransparent($im);
http://www.php.net/manual/en/function.imagecolortransparent.php

Categories