Achtergrond verwijderen en replacen

Door Onbekend Onbekend, 20 jaar geleden, 4.391x bekeken

Bij iChat op OSx heb je dit geloof ik ook, daarvan heb ik het idee. Je kunt eerst een snapshot maken van de achtergrond, en dan zelf in beeld komen. Daarna kun je een achtergrond selecteren. iChat matched dan per pixel of de pixel van het huidige beeld over een komen met de zelfde pixel op het snapshot, als de pixel over een komt dan wordt hij vervangen door de geselecteerde achtergrond.

Ik heb met dit script dat een beetje nagebouwd.

Dit is de afbeelding: http://www.gamerswiki.nl/replacebg/picture.jpg
Dit is het 'snapshot': http://www.gamerswiki.nl/replacebg/bg.jpg
Dit is de 'geselecteerde achtergrond: http://www.gamerswiki.nl/replacebg/replacement.jpg

En dan krijgen we dit als resultaat:
http://www.gamerswiki.nl/replacebg/

Maar je ziet dat anti-alias niet mooi wordt. Overgens is het hier wel heel erg, maar dat komt omdat ik met photoshop gewoon wat op die achtergrond heb getekend en photoshop ook niet zo perfect is in de kwaliteit dan. Jammer.

BTW: je server moet wel wat kracht hebben, het is behoorlijk zwaar, 3 afbeeldingen tegelijk.. je weet wel..

Voorbeeld: http://phphulp.gamerswiki.nl/replacebg

Gesponsorde koppelingen

PHP script bestanden

  1. achtergrond-verwijderen-en-replacen

 

Er zijn 9 reacties op 'Achtergrond verwijderen en replacen'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Tim
tim
20 jaar geleden
 
0 +1 -0 -1
Mooi script, maar het nut ontgaat me toch een beetje :)
Onbekend Onbekend
Onbekend Onbekend
20 jaar geleden
 
0 +1 -0 -1
Het is gewoon voor fun. Het heeft totaal geen nut. Ook niet met iChat. Maar dit heeft natuurlijk nog minder nut omdat je dan de foto's moet gaan maken zelf. Maar ik wil gewoon even laten zien dat dit ook kan met PHP. En bovendien wilde ik kijken of en hoe snel ik dit kon doen. Want ik had al wat zitten denken op school hoe dat zou kunnen, maar dat was dus de juiste manier.
- -
- -
20 jaar geleden
 
0 +1 -0 -1
Maak 'm even zo dat andere formaten dan 1600*1200 ook werken.
Onbekend Onbekend
Onbekend Onbekend
20 jaar geleden
 
0 +1 -0 -1
Ik moet naar familie xD ik doe dat wel als ik thuis kom.
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
de afmetingen kan je gewoon bepalen met:

imagesy(); http://nl.php.net/manual/en/function.imagesx.php
imagesx(); http://nl.php.net/manual/en/function.imagesy.php

dit volg ik echt niet....
$im_picture = '';
$im_bg = '';
$im_replacement = '';
Dat doe je met unset... imagedestroy kan je daar ook beter mee vervangen!

for(); is trager dan while(); scheelt niet veel, maar GD vreet resources, dus kan hier wel wat uitmaken.

Verder is het zo dynamisch als een stokbrood... Dus vind ik het geen goed voorbeeld...
misschien kan je hier nog wat uithalen: http://www.phphulp.nl/php/scripts/9/1297/
- -
- -
20 jaar geleden
 
0 +1 -0 -1
Dat het er niet uitziet komt niet door antialiasing, maar door je JPG-compressie. Misschien dat het beter gaat als je PNG gebruikt: dat zou lossless moeten zijn.
Lode
Lode
20 jaar geleden
 
0 +1 -0 -1
Ik vond deze nog ergens in mijn snippets.
Die probeerd een achtergrond kleur te detecteren. In bijvoorbeeld 10% van de 4 hoeken van een afbeeldings resource.

Ligt meer in het verlengde ervan...
Offset is alleen negatief zie ik nu.. zou je misschien beter +/- kunnen maken.

Hij kan zoeizo wel een stuk beter zie ik.. maar goed voor het idee even ^^

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
/**
 * Try to randomly detect even background colors
 * in non-transparent image. by margin %
 * Will attempt all 4 corners off the image
 *
 * @param resource $img
 * @param int $percente
 * @param int $margin
 * @return int color or bool false on failure
 */

function detectbackground($img, $percent=10, $margin=10){
    $w = imagesx($img) -1;
    $h = imagesy($img) -1;

    $x = $percent * $w / 100;
    $y = $percent * $h / 100;

    $color = NULL;

    for($c=1; $c <= 4; $c++){
        if($c == 1){
            $color = imagecolorat($img, rand(0, $x), rand(0, $y));
        }

        switch($c){
            //top left:
            case 1     :
                    for($i=0; $i < 10; $i++){
                        $col = imagecolorat($img, rand(0, $x), rand(0, $y));
                        if($col != $color && abs($col - $color) > $margin){
                            return false;
                        }
                    }

            //top right
            case 2     :
                    for($i=0; $i < 10; $i++){
                        $col = imagecolorat($img, rand($w-$x, $w), rand(0, $y));
                        if($col != $color && abs($col - $color) > $margin){
                            return false;
                        }
                    }

            //bottom left
            case 3     :
                    for($i=0; $i < 10; $i++){
                        $col = imagecolorat($img, rand(0, $x), rand($h-$y, $h));
                        if($col != $color && abs($col - $color) > $margin){
                            return false;
                        }
                    }

            //bottom right
            case 4     :
                    for($i=0; $i < 10; $i++){
                        $col = imagecolorat($img, rand($w-$x, $w), rand($h-$y, $h));
                        if($col != $color && abs($col - $color) > $margin){
                            //echo $col.' !=4 '.$color.'<br/>'.PHP_EOL;
                            return false;
                        }
                    }
        }
    }

    return $color;
}

?>
Onbekend Onbekend
Onbekend Onbekend
20 jaar geleden
 
0 +1 -0 -1
Ik zal het na school even met PNG doen. En ik zal ook even kijken wat ik kan doen met het anti-aliassing.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Leroy Boerefijn
Leroy Boerefijn
20 jaar geleden
 
0 +1 -0 -1
wat je ook kunt doen is kijken hoe groot het verschil is tussen de twee kleuren van de afbeeldingen
vb:
245,200,137 en 255, 200, 135
die twee verschillen 12, dan kun je dus zeggen dat als ze bijv. 10 of minder verschillen, dat je hem dan alsnog vervangt
zo heb je het probleem met het anti-aliasing niet meer ;)

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. achtergrond-verwijderen-en-replacen

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.