[PHP][GD] Transparante PNG, kleur vervangen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • BryanD
  • Registratie: September 2010
  • Laatst online: 24-07 15:06
Geachte tweakers,

Ik heb een klein probleempje m.b.t. de GD library.

Ik zou graag van een PNG met een transparante achtergrond de pixels die WEL kleur hebben vervangen.

Voorbeeld:
Ik heb een voorwerp dat een effen grijze kleur heeft met een transparante achtergrond, ik wil die effen grijze kleur in een andere kleur veranderen a.d.h.v. een doorgekregen kleur code (hex, rgb, maakt niet zo veel uit welke)

Vervolgens wil ik (in eerste instantie) het plaatje laten zien.

Het plaatje moet dus wel de transparante achtergrond houden, maar het voorwerp moet van kleur veranderen.

Ik heb de hele morgen al op google gekeken, maar geen enkele oplossing schijnt te werken.

Dit heb ik op dit moment:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$aRGB   = array(
    'r' => '255',
    'g' => '0',
    'b' => '0',
    'a' => '0'
);

// Open image
$image  = imagecreatefrompng('1.png');

// HIER MOET DUS IETS KOMEN

// Display
header('Content-Type: image/png');
imagesavealpha($image, true);
imagepng($image);


Het dichtste in de buurt kwam ik nog altijd met het filter colorize, echter is die afhankelijk van de kleur die het plaatje in de eerste instantie heeft. En dus kwam de kleur er nog niet goed uit.

Ik heb ook al geprobeerd om pixel voor pixel het plaatje te vullen...alleen dat is, zoals je wrs. wel weet, niet echt snel....

Ik hoop dat jullie mij verder kunnen helpen want ik zou snap het niet meer.
Bijvoorbaat dank,

Bryan Dijksterhuis

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 11-09 14:14

Tjark

DON'T PANIC

*insert signature here


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Ik heb toevallig van de week iets vergelijkbaars gedaan en pixel voor pixel door het plaatje lopen hoeft helemaal niet langzaam te zijn?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • BryanD
  • Registratie: September 2010
  • Laatst online: 24-07 15:06
@NME, ik weet het niet, maar ik kreeg een timeout, nu heb ik een ander script gepakt, en die doet het wel goed :S, echter krijgt hij geen kleur


@Tjark, die was ik idd ook al tegen gekomen, maar het wou niet lukken.

edit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$aRGB   = array(
    'r' => '129',
    'g' => '39',
    'b' => '39',
    'a' => '0'
);

// Open image
$image  = imagecreatefrompng('1.png');

    $w = imagesx($image);
    $h = imagesy($image);

    // Work through pixels
    for($y=0;$y<$h;$y++) {
        for($x=0;$x<$w;$x++) {
            // Apply new color + Alpha
            $rgb = imagecolorsforindex($image, imagecolorat($image, $x, $y));

        $transparent = imagecolorallocatealpha($image, 0, 0, 0, 127);
        imagesetpixel($image, $x, $y, $transparent);

            $pixelColor = imagecolorallocatealpha($image, $aRGB['r'], $aRGB['g'], $aRGB['b'], $aRGB['a']);
            imagesetpixel ($img, $x, $y, $pixelColor);
        }
    }


// Display
header('Content-Type: image/png');
imageAlphaBlending($image, true);
imagesavealpha($image, true);
imagepng($image);


kleurt het plaatje dus niet

[ Voor 67% gewijzigd door BryanD op 23-09-2011 13:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

imagefilter() met colorize?

Acties:
  • 0 Henk 'm!

  • BryanD
  • Registratie: September 2010
  • Laatst online: 24-07 15:06
@DrAcheH, al geprobeert (zie eerste post), echter is hij dan afhankelijk van het plaatje zelf, en de kleur verschilt dan een goeie paar tinten

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

BryanD schreef op vrijdag 23 september 2011 @ 13:15:
@NME, ik weet het niet, maar ik kreeg een timeout, nu heb ik een ander script gepakt, en die doet het wel goed :S, echter krijgt hij geen kleur
Je moet ook geen script pakken maar een script schrijven dat doet wat jij wil. Kwestie van de image openen, door elke pixel heen loopen en imagesetpixel aanroepen op basis van wat je terugkrijgt uit imagecolorat.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

BryanD schreef op vrijdag 23 september 2011 @ 13:21:
@DrAcheH, al geprobeert (zie eerste post), echter is hij dan afhankelijk van het plaatje zelf, en de kleur verschilt dan een goeie paar tinten
Niet als je het eerst zwart-wit maakt:
PHP:
1
2
3
imagefilter($i, IMG_FILTER_GRAYSCALE);
imagefilter($i, IMG_FILTER_CONTRAST, -255);
imagefilter($i, IMG_FILTER_COLORIZE, $r, $g, $b);

Acties:
  • 0 Henk 'm!

  • BryanD
  • Registratie: September 2010
  • Laatst online: 24-07 15:06
Dank heren het is opgelost :D
Code:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
$aRGB   = array(
    'r' => '50',
    'g' => '231',
    'b' => '150',
    'a' => '0'
);

// Open image
$image  = imagecreatefrompng('1.png');

$w = imagesx($image);
$h = imagesy($image);

// Work through pixels
for($y=0;$y<$h;$y++) {
    for($x=0;$x<$w;$x++) {
        
        // Check the color at the current location
        $at = imagecolorat($image, $x, $y);
        
        // Get the colours in RGBA
        $colors = imagecolorsforindex($image, $at);
        
        // If the alpha of the current pixel does NOT equal 127 (transparant)
        if($colors['alpha'] != 127){
            // Fill create a allocate WITH ALPHA for half transparant pixels (Anti aliasing)
            $colours = imagecolorallocatealpha($image, $aRGB['r'], $aRGB['g'], $aRGB['b'], $colors['alpha']);
            
            // Set the current pixel to the new colours
            imagesetpixel($image, $x, $y, $colours);
        }
    }
}


// Display
header('Content-Type: image/png');
imageAlphaBlending($image, true);
imagesavealpha($image, true);
imagepng($image);


plus punt: hij neemt ook half transparante pixels mee, hij laat de transparante pixels met rust.

Dus tja bedankt voor de snelle repsonse heren :)
Pagina: 1