Autor Zpráva
tazatel
Profil *
Už poněkolikáté jsem narazil na stejný problém.
Mám obrázek:
Chtěl bych ho "invertovat", tzn zaměnit barvu pozadí a barvu textu. V normálních grafických editorech to udělat neumím, zvažuju napsání vlastního algoritmu v php. Uvažuju tímto směrem:
1. najít všechny použité barvy a najít dvě "maxima" ve smyslu barev nejvíce použitých*
2. z těch dvou maxim si definovat nějaké stupnice pro RGB.
3. všechny použité barvy projet v cyklu a každé z nich spočítat pro RGB ty "opačné" pozice na stupnici.

Příklad:
Text má barvu fff.
Pozadí má barvu 000.

Pixelům s barvou 333 nastavím barvu (f-3)(f-3)(f-3).

Zatím to je jen ve fázi úvahy. Budu rád za každou korekci, než se do toho pustím. Možná existuje jednodušší řešení. ani netrvám na tom, že se to musí řešit v php.

*) - "nejvíce použité barvy" úplně nevím, jak najít. Určitě si nevystačím s prostým výčtem použitých barev a počtem výskytů. Bude potřeba nějaká analýza, která bude brát v úvahu i barvy sousedící.
janbarasek
Profil
tazatel:
Nedávno jsem psal script, co umí udělat negativ (nebo jiný barevný tón) z obrázku, třeba ti to pomůže:
<?php
$about = getimagesize('obrazek.png');
Header("Content-type: image/png");
    $obr = ImageCreateTrueColor($about[0], $about[1]);
    $bila = ImageColorAllocate ($obr, 255, 255, 255);
    $styl = array ($bila);
    ImageSetStyle ($obr, $styl);

$im = imagecreatefrompng('obrazek.png');
$x = 0; $y = 0;
while($x < $about[0]) {
    while ($y < $about[1]) {
        $color = imagecolorsforindex($im, imagecolorat($im, $x, $y));
            imagesetpixel($obr, $x, $y, imagecolorallocate($obr, abs(255-$color['red']), abs(255-$color['green']), abs(255-$color['blue'])));
        $y++;
    }
    $y = 0;
    $x++;
}
ImagePNG($obr);
ImageDestroy($obr);

Případně si pouprav ten cyklus a docílíš různých barevných odlišností. Mysli hlavně na výkon, pokud tam vytvoříš složité porovnávání, tak generování obrázku bude trvat neúměrně dlouho, protože se počítá každý pixel extra.
tazatel
Profil *
janbarasek: diky, ale tudy cesta nevede. Toto je obycejna inverze.
janbarasek
Profil
tazatel:
V tom případě moc nechápu otázku, v nadpisu vlákna žádáš o inverzi a když ti na to poskytnu script, tak je to špatně.

Co chceš tedy přesně udělat?
Chceš všechny barvy převést třeba na paletu 5 barev, které vystačí pro celý obrázek? Tj. něco jako 8-bitový obrázek, akorát s vlastní paletou barev?
Chro
Profil
Chce zaměnit barvu pozadí a barvu textu (žlutá/červená na červená/žlutá).

Btw. ten tvůj skript [#2] je vynález kola, podívej se na funkci imagefilter a možnosti různých úprav obrázků. Negate je tam taky.
tazatel
Profil *
janbarasek: proto jsem tu inverzi dal do uvozovek. Jde mi o zamenu barvy textu a barvy pozadi. V tomto pripade bych chtel cervene pozadi a zluty text.
pcmanik
Profil
tazatel:
Chvíľa hladania na googli. Keď chceš len zameniť farby, tak prečo si ten obrázok rovno nevytvoríš? Na zložitých by asi žiadny algoritmus nefungoval a na tom čo si nám tu ukázal bude rýchlejšie vygenerovať nový obrázok ako transformovať farby.
tazatel
Profil *
pcmanik: Podívej se na [#4] a následující dva komentáře.
To, co jsem ukázal, je příklad. V reálu je to tak, že jsem to potřeboval jen párkrát. Nejsem grafik, takže mě překvapilo zjištění, že to grafické editory nejspíš neumí. Nějak si poradím. Chtěl bych to zkusit řešit spíš ze zájmu než z nutnosti.
tazatel
Profil *
Tak ještě jednou pro zpřehlednění:
1. Mám obrázek, kde je jednobarevné pozadí a na něm jednobarevný text. Je tam použit antialiasing, takže těch barev je tam ve skutečnosti pár desítek.
2. Potřebuju nějak zjistit ty dvě hlavní barvy.
3. Ty dvě barvy použiju jako krajní meze stupnice. Každý pixel pak přebarvím podle jednoduchého principu - jak blízko byla jeho původní barva jednomu konci stupnice, tak blízko bude teď tomu druhému.

Když jsem ten druhý bod přeskočil a ty dvě hlavní barvy zadal natvrdo, ten třetí bod mi funguje bezchybně. Teď zbývá "jen" to hlavní. Projít paletu všech použitých barev a najít dvě "těžiště", ve kterých jsou dvě hlavní barvy. Přičemž ty barvy jako takové tam možná vůbec použity nejsou, protože jpeg.
janbarasek
Profil
tazatel:
Výskyt nejčastějších barev lze udělat úplně jednoduše. Nejdřív projeď obrázek po pixelech (ne všechny, třeba jeden z 20), někam do pole si ukládej RGB číslo barvy a počet jeho výskytů. Pak to setřiď nějakou rychlou funkcí (třeba quicksort dostupný přes sort();) a tím ihned získáš informace o tom, jaká 2 barvy jsou nejčastější a můžeš směle začít nahrazovat.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: