Hey allen,

Ik zit me een ongeluk te zoeken naar een script waarbij ik transparante PNG bestanden (bijv. images/back/back.png) kan verkleuren van bijvoorbeeld #444444 (grijs-zwart) naar bijvoorbeeld #ff6600 (oranje).

Deze wil ik op de volgende manier kunnen inladen:

<img src="colorize.php?img=images/back/back.png" alt="" />

Iemand die me kan helpen?
Ik ben zo'n beetje ten einde raad.

Alvast bedankt
<?php

// PAD NAAR DE AFBEELDING
$switchColorImage = "images/back/back.png";

// MAAK EEN NIEUWE AFBEELDING
$image = imagecreatefrompng($switchColorImage);
imagetruecolortopalette($image,false, 255);

// KLEUR DIE GEWISSELD MOET WORDEN
$switchColor = imagecolorclosest($image,  255, 255, 255);

// NIEUWE KLEUR
imagecolorset($image, $switchColor, 255, 128, 0);

header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);

?>
Dit zou het moeten doen.

Zie ook: http://www.phphulp.nl/php/forum/topic/script-review-class-watermerk-zoals-1001-anderen/81928/1/#620286
Bedankt, G P, dat werkt al aardig!

Het enige probleem op 't moment is nu dat echt letterlijk maar één bepaalde kleur verkleurd wordt, en dat de randen niet mooi meer zijn.

Voor:


Na:


Is daar ook nog een oplossing voor?

Alvast bedankt
Die randjes zijn niet helemaal zwart maar worden al grijstinten.
Of je doet voor iedere tint individueel een andere tint instellen.
Of je kijkt wat er nu eigenlijk verschuift in de kleur ruimte. Voor dit tweede staat een algoritme beneden beschreven.

Persoonlijk vind ik RGB kleurruimte niet zo fijn voor dit soort bewerkingen dus gebruik ik liever HSL (zoek maar op).

Stap 1:
Bereken de H, S, L verschuiving van je originele kleur (zwart) naar je nieuwe kleur (oranje).
Let op: in het het geval van zwart #000000 en een iets lichtere tint #010101 kan het zijn dat er totaal andere Hue values bijhoren. Dit valt niet te zien omdat Lightness helemaal laag staat. In dit geval stel zelf een (statisch) Hue in.

Stap 2:
Laad alle tinten van je originele plaatje in een array.

Stap 3:
Bereken voor alle tinten de nieuwe HSL doormiddel van de eerder berekend verschuiving.

Stap 4:
Je krijgt een array uit van alle nieuwe tinten. Vervang nu alle originele tinten door de nieuwe tinten.

----

In het geval dat je plaatje complexer wordt (je hebt nu alleen zwart/wit). Maar stel je hebt die zwarte pijl met een rood bolletje en je wilt alleen het zwart oranje maken. Dan moet je dat rode bolletje niet meenemen in je array van originele tinten. Dit kan je doen door te filteren op bepaalde Hue waardes of andere parameters waar je kleur buiten moet vallen. Zo kan je bijvoorbeeld ook alle lichte delen van een foto van kleur veranderen en de donkere met rust laten.

Je zou eens naar alle functies moeten kijken die GD sowieso al ondersteund of libraries van andere mensen. Waarschijnlijk is de functionaliteit die je zoekt al ergens geimplementeerd.
@Afhaal Chinees: Ik heb het zojuist geprobeerd met de class die ik geschreven heb en het zwart wordt volledig oranje, zonder vieze randen enz...
Ik heb het ook even geprobeerd, zie voorbeeld:
http://rcsdesign.nl/amx/color/index.php

index.php
<img src="color.php" /><br />
<?php
echo "<pre>"; var_dump(gd_info()); echo "</pre>";
?>

color.php
<?php
$switchColorImage = "back.png";

$image = imagecreatefrompng($switchColorImage);
imagetruecolortopalette($image,false, 255);
$switchColor = imagecolorclosest($image,  68, 68, 68);

imagecolorset($image, $switchColor, 255, 128, 0);

header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>

Zou het aan de GD versie liggen?
Probeer het volgende
imagetruecolortopalette($image,false, 255);

eens te wijzigen door
imagetruecolortopalette($image,true, 216);

Laat me dan weten of het lukt, of niet lukt.
Teveel soorten zwart-tinten, met het volgende moet het zeker lukken:
<?php

// PAD NAAR DE AFBEELDING
$switchColorImage = "back.png";

// MAAK EEN NIEUWE AFBEELDING
$image = imagecreatefrompng($switchColorImage);
imagetruecolortopalette($image,true, 216);

// KLEUR 1 DIE GEWISSELD MOET WORDEN
$switchColor = imagecolorclosest($image,  0, 0, 0);
imagecolorset($image, $switchColor, 255, 128, 0);
// KLEUR 2 DIE GEWISSELD MOET WORDEN
$switchColor = imagecolorclosest($image,  42, 42, 42);
imagecolorset($image, $switchColor, 255, 128, 0);
// KLEUR 3 DIE GEWISSELD MOET WORDEN
$switchColor = imagecolorclosest($image,  84, 84, 84);
imagecolorset($image, $switchColor, 255, 128, 0);

header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);

?>
Ja, omdat de afbeelding van zwart naar transparant overgaat zijn de buitenste randen niet echt helemaal zwart maar grijs, daarom dus het 3x wijzigen van kleur.

Reageren