| Autor | Zpráva | ||
|---|---|---|---|
| sniclman Profil * |
#1 · Zasláno: 1. 1. 2014, 22:19:46
Ahoj, potřeboval bych poradit se zachováním průhledné barvy při použití funkce imagecopyresampled.
Program má vytvořit kruhovou výseč z libovolného obrázku. Pokud vynechám funkci imagecopyresampled, funguje vše v pořádku. Zdrojový kód programu: $filename = $_GET["img"];
$quality = (100-$_GET["q"])*0.09;
list($width, $height) = getimagesize($filename);
/*VYTVOŘENÍ OBRÁZKU detekce formátu*/
$createimagefrom = array(IMAGETYPE_GIF => 'gif',IMAGETYPE_JPEG => 'jpeg',IMAGETYPE_JPG => 'jpeg',IMAGETYPE_PNG => 'png');
switch($createimagefrom[exif_imagetype($filename)]){
case 'jpeg': $image = imagecreatefromjpeg($filename); break;
case 'gif': $image = imagecreatefromgif($filename); break;
case 'png': $image = imagecreatefrompng($filename); break;}
//kruhová výseč
if($_GET["c"] != null){
if($height > $width){$circle_size = $width;}
else if($width > $height){$circle_size = $height;}
else{}
$output = imagecreatetruecolor($circle_size, $circle_size);
imagecopy($output, $image, 0, 0, $width/2-$circle_size/2, $height/2-$circle_size/2, $circle_size, $circle_size);
//Vytvoří masku s růžovou barvou o velikosti vstupního obrázku
$mask = imagecreatetruecolor($circle_size, $circle_size);
$pink = imagecolorallocate($mask, 255, 0, 255);
imagefill($mask, 0, 0, $pink);
//Vytvoří uprostřed masky výseč (elipsa/kruh) s transparentní barvou
$circle = imagecolorallocate($mask, 255, 255, 255);
imagecolortransparent($mask, $circle);
imagefilledellipse($mask, $circle_size/2, $circle_size/2, $circle_size, $circle_size, $circle);
//nakopíruje masku přes vstupní obrázek a nastaví masku jako průhlednou
imagecopymerge($output, $mask, 0, 0, 0, 0, $circle_size, $circle_size, 100);
imagecolortransparent($output, $pink);}
/*ZMENŠENÍ*/
$image_p = imagecreatetruecolor(300, 300);
imagecopyresampled($image_p, $output, 0, 0, 0, 0, 300, 300, $circle_size, $circle_size);
/*VÝSTUP ZOBRAZENÍ*/
header('Content-Type: image/png');
imagepng($image_p);
imagedestroy($image_p);obrázek upravený programem
Děkuji za veškeré rady. |
||
| DarkMeni Profil |
#2 · Zasláno: 3. 1. 2014, 18:32:07
Kdysi sem taky něco podobnýho řešil, a pomohly mi funkce
imageAlphaBlending() a imageSaveAlpha()
Nějak takto sem to nakonec vyřešil <?php
//$file = isset($_GET['image']) ? $_GET['image'] : 'notfound.jpg';
$file = 'image.jpg';
if(!file_exists($file)){
exit;
}
$file_ext = substr($file, strrpos($file, '.') + 1);
switch($file_ext){
case 'jpg':
$image = imageCreateFromJPEG($file);
break;
case 'png':
$image = imageCreateFromPNG($file);
break;
case 'bmp':
$image = imageCreateFromBMP($file);
break;
}
list($img_width, $img_height) = getImageSize($file);
if(isset($_GET['size']) && is_numeric($_GET['size'])){
$width = $_GET['size'];
}else{
$width = $img_width > $img_height ? $img_height : $img_width;
}
if($img_width > $img_height){
$clip_x = 0;//round(($img_width - $img_height) / 4);
$clip_y = 0;
}else{
$clip_x = 0;
$clip_y = 0;//round(($img_height - $img_width) / 4);
}
$height = $width;
$center = round($width / 2);
$radius = $width - 4;
$output_image = imageCreateTrueColor($width, $height);
$ellipse_image = imageCreateTrueColor($width, $height);
$white = imageColorAllocate($ellipse_image, 0xFF, 0xFF, 0xFF);
$black = imageColorAllocate($ellipse_image, 0x00, 0x00, 0x00);
$transparent = imageColorAllocateAlpha($ellipse_image, 0xFF, 0xFF, 0xFF, 127);
imageAlphaBlending ($ellipse_image, false);
imageFill ($ellipse_image, 0, 0, $white);
imageFilledEllipse ($ellipse_image, $center, $center, $radius, $radius, $transparent);
imageEllipse ($ellipse_image, $center, $center, $radius, $radius, $black);
imageCopyResampled ($output_image, $image, 0, 0, $clip_x, $clip_y, $width, $height, $img_width, $img_height);
imageCopy ($output_image, $ellipse_image, 0, 0, 0, 0, $width, $height);
$bg_transparency = imageColorAllocateAlpha($output_image, 0xFF, 0x00, 0x00, 127);
imageFill($output_image, 0, 0, $bg_transparency);
header('Content-Type: image/png');
imageSaveAlpha($output_image, true);
imagePNG($output_image);
imageDestroy($image);
imageDestroy($output_image);
imageDestroy($ellispe_image);
?> |
||
|
Časová prodleva: 3 dny
|
|||
| sniclman Profil * |
#3 · Zasláno: 6. 1. 2014, 13:47:59
DarkMeni:
Ahoj, díky za poskytnutý zdroják. Problém je že potřebuji zmenšit obrázek až po ořezání a zprůhlednění okrajů. Takto se dostanu do situace kdy budu mít sice zmenšený obrázek ale hrany kružnice budou mít viditelné zuby. |
||
| DarkMeni Profil |
Aha, tak zkus před
imageCopyResampled() vypnout míchání průhlednosti (imageAlphaBlending()) pro $dst_image
Ale myslim že to, jestli to přerozměruješ před oříznutím nebo po něm, tak ty zuby až tak nějak neřeší, ale nevim, možná jo Třeba takto (upravená část kódu): <?php
imageAlphaBlending ($ellipse_image, false);
imageFill ($ellipse_image, 0, 0, $white);
imageFilledEllipse ($ellipse_image, $center, $center, $radius, $radius, $transparent);
imageEllipse ($ellipse_image, $center, $center, $radius, $radius, $black);
imageCopy ($output_image, $image, 0, 0, 0, 0, $width, $height);
imageCopy ($output_image, $ellipse_image, 0, 0, 0, 0, $width, $height);
imageAlphaBlending($output_image, false);
$bg_transparency = imageColorAllocateAlpha($output_image, 0xFF, 0x00, 0x00, 127);
imageFill($output_image, 0, 0, $bg_transparency);
imageEllipse($output_image, $center, $center, $radius, $radius, $transparent);
$output_image2 = imageCreateTrueColor($new_width, $new_height);
imageAlphaBlending($output_image2, false);
imageCopyResampled ($output_image2, $output_image, 0, 0, $clip_x, $clip_y, $new_width, $new_height, $img_width, $img_height);
header('Content-Type: image/png');
imageSaveAlpha($output_image2, true);
imagePNG($output_image2);
?> |
||
| sniclman Profil * |
#5 · Zasláno: 8. 1. 2014, 14:03:08
DarkMeni:
Děkuju za zdroják, funguje to perfektně. Přikládám vlastní zdroják, který z obrázku vyřízne střed a udělá kulaté okraje. <?php
$file = $_GET['img'];
$output_size = $_GET["s"];
list($width, $height) = getimagesize($file);
//detekce formátu
$createimagefrom = array(IMAGETYPE_GIF => 'gif',IMAGETYPE_JPEG => 'jpeg',IMAGETYPE_PNG => 'png');
switch($createimagefrom[exif_imagetype($file)]){
case 'jpeg': $image = imagecreatefromjpeg($file); break;
case 'gif': $image = imagecreatefromgif($file); break;
case 'png': $image = imagecreatefrompng($file); break;}
//čtvercový rozměr
if($height > $width){$circle_size = $width;}
else if($width > $height){$circle_size = $height;}
else{}
//maska
$ellipse_image = imagecreatetruecolor($circle_size, $circle_size);
$background = imagecolorallocate($ellipse_image, 255, 255, 255);
$transparent = imagecolorallocatealpha($ellipse_image, 0, 0, 0, 127);
imagealphablending ($ellipse_image, false);
imagefill ($ellipse_image, 0, 0, $background);
imagefilledellipse ($ellipse_image, $circle_size/2, $circle_size/2, $circle_size-6, $circle_size-6, $transparent);
//kopírování masky a ořezání obrázku
$proces_image = imagecreatetruecolor($circle_size, $circle_size);
imagecopy($proces_image, $image, 0, 0, $width/2-$circle_size/2, $height/2-$circle_size/2, $circle_size, $circle_size);
imageCopy($proces_image, $ellipse_image, 0, 0, 0, 0, $circle_size, $circle_size);
imagealphablending($proces_image, false);
imagefill($proces_image, 0, 0, $transparent);
//zmenšení převzorkování
$output = imagecreatetruecolor($output_size, $output_size);
imagealphablending($output, false);
imagecopyresampled ($output, $proces_image, 0, 0, 0, 0, $output_size, $output_size, $circle_size, $circle_size);
//výstup
header('Content-Type: image/png');
imagesavealpha($output, true);
imagepng($output);
imagedestroy($output);
imagedestroy($proces_image);
imagedestroy($image);
imagedestroy($ellipse_image);
?> |
||
|
Časová prodleva: 12 let
|
|||
0
