Autor Zpráva
Jenicek
Profil
zdravím, řeším celkem zajímavou pikantnost...
k tvprogramu (http://tv-program.tetristv.com/) řeším "aktuální" náhled TV co frčí :)
pikantní problém tkví ale v tom, že i když získám obrázek celkem v pohodě obrázek je rozostřený, no když se povede a zachytí se statický obraz nebo běží animák obraz je krásně čistý....

zajímalo by mě, zda někdo už něco podobného s vylepšováním obrazu v php například u profilových obrázků řešil...

viz:
http://tv-program.tetristv.com/nahled/MGM.jpg


a
http://tv-program.tetristv.com/nahled/Disney%20Channel.jpg


více na http://tv-program.tetristv.com/nahled/
Jenicek
Profil
po usilovném hledání jsem našel tuto funkci :-)

function UnsharpMask($img, $amount, $radius, $threshold)    { 


    if ($amount > 500)    $amount = 500; 
    $amount = $amount * 0.016; 
    if ($radius > 50)    $radius = 50; 
    $radius = $radius * 2; 
    if ($threshold > 255)    $threshold = 255; 
     
    $radius = abs(round($radius)); 
    if ($radius == 0) { 
        return $img; imagedestroy($img); break;        } 
    $w = imagesx($img); $h = imagesy($img); 
    $imgCanvas = imagecreatetruecolor($w, $h); 
    $imgBlur = imagecreatetruecolor($w, $h); 
     
    if (function_exists('imageconvolution')) { // PHP >= 5.1  
            $matrix = array(  
            array( 1, 2, 1 ),  
            array( 2, 4, 2 ),  
            array( 1, 2, 1 )  
        );  
        imagecopy ($imgBlur, $img, 0, 0, 0, 0, $w, $h); 
        imageconvolution($imgBlur, $matrix, 16, 0);  
    }  
    else {  
        for ($i = 0; $i < $radius; $i++)    { 
            imagecopy ($imgBlur, $img, 0, 0, 1, 0, $w - 1, $h); // left 
            imagecopymerge ($imgBlur, $img, 1, 0, 0, 0, $w, $h, 50); // right 
            imagecopymerge ($imgBlur, $img, 0, 0, 0, 0, $w, $h, 50); // center 
            imagecopy ($imgCanvas, $imgBlur, 0, 0, 0, 0, $w, $h); 

            imagecopymerge ($imgBlur, $imgCanvas, 0, 0, 0, 1, $w, $h - 1, 33.33333 ); // up 
            imagecopymerge ($imgBlur, $imgCanvas, 0, 1, 0, 0, $w, $h, 25); // down 
        } 
    } 

    if($threshold>0){ 
        // Calculate the difference between the blurred pixels and the original 
        // and set the pixels 
        for ($x = 0; $x < $w-1; $x++)    { // each row
            for ($y = 0; $y < $h; $y++)    { // each pixel 
                     
                $rgbOrig = ImageColorAt($img, $x, $y); 
                $rOrig = (($rgbOrig >> 16) & 0xFF); 
                $gOrig = (($rgbOrig >> 8) & 0xFF); 
                $bOrig = ($rgbOrig & 0xFF); 
                 
                $rgbBlur = ImageColorAt($imgBlur, $x, $y); 
                 
                $rBlur = (($rgbBlur >> 16) & 0xFF); 
                $gBlur = (($rgbBlur >> 8) & 0xFF); 
                $bBlur = ($rgbBlur & 0xFF); 
                 
                // When the masked pixels differ less from the original 
                // than the threshold specifies, they are set to their original value. 
                $rNew = (abs($rOrig - $rBlur) >= $threshold)  
                    ? max(0, min(255, ($amount * ($rOrig - $rBlur)) + $rOrig))  
                    : $rOrig; 
                $gNew = (abs($gOrig - $gBlur) >= $threshold)  
                    ? max(0, min(255, ($amount * ($gOrig - $gBlur)) + $gOrig))  
                    : $gOrig; 
                $bNew = (abs($bOrig - $bBlur) >= $threshold)  
                    ? max(0, min(255, ($amount * ($bOrig - $bBlur)) + $bOrig))  
                    : $bOrig; 
                 
                 
                             
                if (($rOrig != $rNew) || ($gOrig != $gNew) || ($bOrig != $bNew)) { 
                        $pixCol = ImageColorAllocate($img, $rNew, $gNew, $bNew); 
                        ImageSetPixel($img, $x, $y, $pixCol); 
                    } 
            } 
        } 
    } 
    else{ 
        for ($x = 0; $x < $w; $x++)    { // each row 
            for ($y = 0; $y < $h; $y++)    { // each pixel 
                $rgbOrig = ImageColorAt($img, $x, $y); 
                $rOrig = (($rgbOrig >> 16) & 0xFF); 
                $gOrig = (($rgbOrig >> 8) & 0xFF); 
                $bOrig = ($rgbOrig & 0xFF); 
                 
                $rgbBlur = ImageColorAt($imgBlur, $x, $y); 
                 
                $rBlur = (($rgbBlur >> 16) & 0xFF); 
                $gBlur = (($rgbBlur >> 8) & 0xFF); 
                $bBlur = ($rgbBlur & 0xFF); 
                 
                $rNew = ($amount * ($rOrig - $rBlur)) + $rOrig; 
                    if($rNew>255){$rNew=255;} 
                    elseif($rNew<0){$rNew=0;} 
                $gNew = ($amount * ($gOrig - $gBlur)) + $gOrig; 
                    if($gNew>255){$gNew=255;} 
                    elseif($gNew<0){$gNew=0;} 
                $bNew = ($amount * ($bOrig - $bBlur)) + $bOrig; 
                    if($bNew>255){$bNew=255;} 
                    elseif($bNew<0){$bNew=0;} 
                $rgbNew = ($rNew << 16) + ($gNew <<8) + $bNew; 
                    ImageSetPixel($img, $x, $y, $rgbNew); 
            } 
        } 
    } 
    imagedestroy($imgCanvas); 
    imagedestroy($imgBlur); 
     
    return $img;
}

na webu (zdroj: http://vikjavev.no/computing/ump.php) to funguje krásně ale já to za boha nějak nemohu rozběhat...
stále mi to vyhazuje Resource id #3
díky za rady :-)
panther
Profil
Jenicek:
předpokládám, že to vrací jeden z těch dvou returnů, co tam máš (dodal-li jsi správný kód)... To znamená, že v proměnné img, kterou funkci předáváš jako parametr, je mysql resource (výstup z mysql_query), nikoliv string (název obrázku?).
Jenicek
Profil
nene, z mysql vůbec nic netahám...
img volám imagecreatefromjpeg:
imagecreatefromjpeg("Ztest.jpg");
panther
Profil
Jenicek:
výborně, a teď si přečti, co že ta tebou užívaná funkce vrací - asi tě nepřekvapí, že resource. Nezkoumal jsem ten tvůj kód, proto jsem tipl téměř naslepo - mysql_query vrací totéž.
Jenicek
Profil
no dobře ale jak vyvolám img? :(
zkoušel jsem už snad všechno...
ocenil bych radu :D už to zkouším hodinu a začíná mi jít z toho hlava kolem...
posledních 10 minut na to jenom zírám a dělám že přemýšlím :D
děkuji

případně se na to vyflajznu a porobím to v cčku vyhýbal jsem se tomu jak čert kříže ale asi to bude snažší :D
Alphard
Profil
Jenicek:
Tohle není problém PHP :-)
Té funkci předáte resource, ona vám vrátí resource na jiný obrázek. Tak to ještě prožeňte imagejpeg() a mělo by to fungovat.
Jenicek
Profil
děkuji ... no nakonec to stejně budu muset řešit přes Cčko toto má spíše opačný efekt než zaostření :(


nakonec jsem to prohnal přes aplikaci VLC kde jsem nastavil prokládání, no obraz už je čistý :)
jen to trvá trošku déle jednoznačtě toto byla výborná zkušenost :)
snad se i někomu bude hodit až to bude hodinu googlit jako já :D
Alphard
Profil
Kdybych potřeboval zaostřovat, nejdříve bych si zkusil http://www.php.net/manual/en/imagick.sharpenimage.php případně http://www.php.net/manual/en/imagick.adaptivesharpenimage.php.

VLC pracuje přímo s videem, kde berete video soubory? Občas se tady objeví dotaz, jak získat náhledy z videa, jestli to máte vyřešené, určitě by to někdo časem ocenil.
Jenicek
Profil
VLC umí zázraky ... umí i fotit... stačí jen vhodně vyvolaný příkaz (mohu mezi SW pak hodit nějaký návod ale pravděpodobně toto půjde i vygooglit) :)
video soubory... vlastním malou kabelovku řešenou přes net proto mohu řešit i TV program vytahovaný z EPG a screeny (takže DVB-T a DVB-S) :)

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: