Avatar billede larsvn Nybegynder
02. april 2003 - 15:06 Der er 1 løsning

Transparens i PNG TrueColor-billede

Jeg har et program der eksporterer et PNG-billede, hvor jeg ønsker at alt det hvide skal være transparent. Desværre håndterer det pågældende program ikke transparens, så det skal løses via PHP.

På PHP.net har jeg set at det (absolut) kun er den sorte farve der kan gøres transparent i TrueColor, hvorfor jeg først har rettet i pixelfarverne så rgb(0,0,0) => rgb(1,1,1) og derefter rgb(255,255,255) => rgb(0,0,0). Og det virker umiddelbart fint. Men jeg kan ikke få den sorte til at blive transparent ! :-(

De eksisterende eksempler på PHP.net og her på Eksperten går alle på at lægge et transparent lag ovenpå et ikke-transparent lag, men jeg vil have transparens i alle lag, så billedet kan lægges ovenpå andre billeder.

Min PHP-kode:
// load image
$imgsrc = imagecreatefrompng($pathname);
// define colors
$white = imagecolorallocate($imgsrc,255,255,255);
$gray  = imagecolorallocate($imgsrc,  1,  1,  1);
$black = imagecolorallocate($imgsrc,  0,  0,  0);
// width&height
$img_w = imagesx($imgsrc);
$img_h = imagesy($imgsrc);
// black => almost black
for($x=0; $x<$img_w; $x++)
for ($y=0; $y<$img_h; $y++)
  if (imagecolorat($imgsrc,$x,$y) == $black)
  imagefill($imgsrc,$x,$y,$gray);
// white => true black
for($x=0; $x<$img_w; $x++)
for ($y=0; $y<$img_h; $y++)
  if (imagecolorat($imgsrc,$x,$y) == $white)
  imagefill($imgsrc,$x,$y,$black);
// make true black transparent
imagecolortransparent($imgsrc,$black);
// re-save to disk & clean-up
imagepng($imgsrc,$pathname);
imagedestroy($imgsrc);

Jeg ved jeg skal anvende GD/2 (php_gd2), og har prøvet dette med både PHP 4.2.3 og 4.3.1, uden held. Problemet skal alt-andet-lige løses i PHP 4.2.3, og det SKAL løses ift. TrueColor. Og så kører jeg det altså på Win2K hvis det har nogen relevans. ;-)

Et eksempel på det billede jeg får ud findes her:
http://gis.hvm.dk/transparens/output.png
Det tilsvarende oprindelige billede findes her:
http://gis.hvm.dk/transparens/input.png
Avatar billede larsvn Nybegynder
08. maj 2003 - 20:58 #1
Jeg fandt selv svaret, så jeg lukker dette spørgsmål. Men blot for at runde emnet af så viste det sig faktisk at være ret enkelt.

I TrueColor handler det (åbenbart) ikke om farveværdier men om "alpha-værdien", dvs. RGBA. Alpha-komponenten angiver transparensen med værdier 0-127 (hhv. opaque og transparent), så jeg skulle blot erstatte den hvide farve med en fuldt transparent farve (her også hvid):

$img = imagecreatefrompng($pathname);
$white = imagecolorallocate($img,255,255,255);
$img_w = imagesx($img);
$img_h = imagesy($img);
$transp = imagecolorclosestalpha($img, 255, 255, 255, 127);
for($x=0; $x<$img_w; $x++)
  for ($y=0; $y<$img_h; $y++)
    if (imagecolorat($img,$x,$y) == $white)
      imagesetpixel($img,$x,$y,$transp);
imagepng($img,$pathname); // re-save to disk
imagedestroy($img);

Det virker naturligvis kun ifm. PHP med GD/2, dvs. enten 4.3.x eller med eksternt loadet php_gd2-modul.

Håber andre kan få glæde af denne korte vejledning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester