Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Kuvan läpinäkyvyyden säätäminen

Sivun loppuun

Aloittelija3 [01.10.2008 16:12:56]

#

Eli saan kyllä ladattua valmiin kuvan, mutta miten saisin muutettua niitä alpha-juttuja? Eli mitä tähän pitäis lisätä jos haluaisin, sanotaan nyt vaikka kuvan puolix läpinäkyväx?

header("Content-type: image/png");

$kuva = imagecreatefrompng("https://www.ohjelmointiputka.net/img/putka.jpg");

imagepng($kuva);
imagedestroy($kuva);

E: No voe.. väärä alue -.-

Deffi [01.10.2008 16:23:04]

#

Pääset varmaan helpommalla käyttämällä CSS:n opacityä.

Aloittelija3 [01.10.2008 16:25:39]

#

Se ois kyllä kätevä.. mutta ei valitettavasti käy tässä tilanteessa

Marbo [01.10.2008 16:41:31]

#

onkohan tästä apua? https://www.php.net/manual/en/function.imagecolortransparent.php

tsuriga [01.10.2008 16:45:35]

#

Waiccen walmista tecijätä tähän hätähän löytänyt / onnistuupi haettu teco sitomalla useampi tecijä. Periaattehella tällä luoman olet: silmukoiden cuvitteen läpi käyden / picseli picseliltä tarcastellen / näkyvyhen puolitat / tyytyväinnä ihastelet.

EDIT: x:t hämäs. imagecolortransparent ei kuvauksensa mukaan käyne tähän hommaan, oma sepostukseni käyttäisi imagecolorexactalpha/imagecolorresolvealpha + imagecolorallocatealpha + imagesetpixel (+ imagesavealpha). Tai jos käytössä on Imagemagick niin sillä varmasti luonnistuu jollain erittäin yksinkertaisella komennolla, ehkä tällä:

convert image.png -channel A -evaluate divide 2 +channel image_semitrans.png

Aloittelija3 [01.10.2008 17:32:45]

#

ööö mitäs mä tolla imagecolorexactalphan indexillä teen? ja mitä eroa noilla imagecolorexactalpha/imagecolorresolvealpha on??

tsuriga [01.10.2008 17:55:42]

#

Waustauxen oivaltaecsex / lucemahan on sinun wieraincielistä caicen tiedon indexiä (PHP:n manuaali). Tai coceilemahan empiirisin ceinoin.

Nojoo eli eihän siellä manuskassa noista eroista sen tarkemmin kerrota, itse käyttäisin tässä tilanteessa ensimmäistä ja vaihtaisin resolveen, mikäli tarve vaatii. Eli käytännössä looppaat pikselit läpi, otat sen alpha-arvon, kerrot sitä sopivasti tai pistät arvoksi sen 64 (50 %) ja pukkaat takaste kuvaan. Ja jos kuvassa ei ole alpha-kanavaa entuudestaan niin käytä imagealphablending-funkkaria.

Aloittelija3 [01.10.2008 18:21:47]

#

tsuriga kirjoitti:

Eli käytännössä looppaat pikselit läpi

Miten miten miten :P

Tarviiks tossa imagecolorat?

User137 [01.10.2008 20:44:04]

#

tsurigan ohjeilla muutetaan JPG kuva muotoon PNG. Kun käytät PNG kuvia niin nettisivun lähdekoodissa sitä ei tarvitse huomioida millään tavalla, se vain toimii. Kuitenkin on monia kuvankäsittelyohjelmia joilla saat aikaan halutunlaisen läpinäkyvyyden. Muutamia mainitakseni Gimp tai Photoshop.

Aloittelija3 [01.10.2008 21:01:30]

#

Oho, enpä huomannutkaan että toi esimerkkinä antamani putkalogo oli .jpg. Mutta yritän siis tehä sellasta dynaamista kuvaa.. vai mixkäköhän sitä pitäis sanoa.. eli photoshoppikaan ei valitettavasti käy.

E: Hitto! Hermot menee :( Miten saan tehtyä niin että ensin käydään läpi pixelit (1,1), (2, 1), (3,1) ... (100, 1) Sitten kun on päästy x-suunnassa sataan tutkitaan (1,2), (2,2), (3,2) ja jatkuu niin kauan kun päästään y-suunnassa maximiin, vaikka 120. Toivottavasti tajusitte.. turhaudun näihin for-looppeihin.

E2: Saatoin sittenki tajuta ton looopin

Aloittelija3 [01.10.2008 22:07:41]

#

Jessss sain toimimaa :)) seuraavanlaisella coodilla joka on varmasti kaukana täydellisestä mutta toimiipa kuitenkin. Kiitos kovasti tsurigalle ja muille jotka vaivauduitte vastaamaan :)

<?php
header("Content-type: image/png");

$kuva = imagecreatefrompng("jokukuvatahan.png");

imagealphablending($kuva, false);
imagesavealpha($kuva, true);

$y = 0;

while($x < 100)
{
  for($y = 0; $y < 120; $y++)
  {
    $vari = imagecolorat($kuva, $y, $x);

    $r = ($vari >> 16) & 0xFF;
    $g = ($vari >> 8) & 0xFF;
    $b =  $vari & 0xFF;
    $a = ($vari & 0x7F000000) >> 24;

    $uusvari = imagecolorallocatealpha($kuva, $r, $g, $b, 64);
    imagesetpixel($kuva, $y, $x, $uusvari);
  }
 $x++;
}

imagepng($kuva);
imagedestroy($kuva);
?>

tsuriga [02.10.2008 16:00:56]

#

Juu unohtu mainita tuo funkkari, jolla se alkuperäinen väriarvo otetaan talteen. Imagecolorat ei näyttäisi manuaalin mukaan palauttavan alfaa. Sen sijaan, käytä imagecolorsforindex-funkkaria, mikäli haluat muokata alkuperäistä alfaa (nythän sitä ei tässä tarvita, koska käytät aina vakioarvoa 64). Kuvan koon saa tietoonsa getimagesize- tai imagesx- & imagesy -funktioilla, erona funktioille syötettävien parametrien tyypit.

Huomioita:
-Ensimmäisen whilen voi myös korvata for-lausekkeella.
-Headerin voi lähettää myös vasta sitten kun kuva on generoitu, eipähän tule niin herkästi time-outtia jos generoinnissa kestää.
-$y-muuttujaa ei tarvitse alustaa ennen silmukkaa, koska sitä ei käytetä silmukan ulkopuolella.

Tuo muutama viesti aikaisemmin liittämäni pätkä (jos se nyt edes oli Imagemagick-pätkä, voi myös olla pakettiin liittymättömän ja aivan erillisen convert.exe:n komentorivi) taitaa puolittaa läpinäkyvyyden. Sitten jos vanhoilla selaimilla satut testailemaan niin huomioitavan arvoinen seikka on, että IE-selaimet ennen versiota 7 eivät tainneet tukea PNG:n alfa-kanavaa.

Tässä metodiversio koodista, ottaa parametrikseen kuvaresurssin:

<?php
/* encoding=utf-8 */

/**
 * Image effects.
 */
class ImageEffects
{

    /**
     * Turns given image semitransparent.
     *
     * @param resource Image resource to edit
     * @return resource Semi-transparent image.
     *
     * @throws Exception When GD cannot parse image size from input
     */
    public static function imagesemitransparent($img)
    {
        /* Ensure that parameter is image */
        if (@imagesx($img) === false) {
            throw new Exception('Cannot calculate image dimensions');
        }

        /* Disable blending and enable alpha-channel */
        imagealphablending($img, false);
        imagesavealpha($img, true);

        /* Loop through pixels */
        for ($x = 0; $x < imagesx($img); $x++) {
            for($y = 0; $y < imagesy($img); $y++) {
                /* Get original colours */
                $col = imagecolorat($kuva, $y, $x);
                $r = ($col >> 16) & 0xFF;
                $g = ($col >> 8) & 0xFF;
                $b = $col & 0xFF;

                /* Add alpha value for semitransparency */
                $newCol = imagecolorallocatealpha($img, $r, $g, $b, 64);
                imagesetpixel($img, $y, $x, $newCol);
            }
        }

        return $img;
    }

}

?>

<?php

/* Read original image */
$src = "jokukuvatahan.png";
$image = imagecreatefrompng($src);

try {
    /* Apply semitransparency */
    $image = ImageEffects::imagesemitransparent($image);

    /* Output image and destroy resources */
    header("Content-type: image/png");
    imagepng($image);
    imagedestroy($image);
} catch (Exception $e) {
    echo $e->getMessage();
}

?>

Toivottavasti pelittää, en pysty testaamaan tällä koneella.

User137 [02.10.2008 17:43:47]

#

Onko tuo ihan tarpeellista piirtää pikseli kerrallaan? Tarkotan vaan että eikö selaimen oma piirturi osaa png:n piirtää alpha-kanavalla 100 kertaa nopeammin? (kyllä, luku heitetty ihan hatusta) En tarkemmin tunne php:n piirto-toimintaa mutta sen verran tiedän että sillä voi HTML koodia hyödyntää.

tsuriga [02.10.2008 18:06:55]

#

Jos kuva on tosiaan tarkoitus vain tulostaa selaimelle, CSS:n opacity kuulostaa paremmalta vaihtoehdolta. Jos kuva taasen halutaan tallentaa (joko kuvantarjoajan tai käyttäjän päässä) myöhempää käyttöä varten tai jos kuvaa ei käytetäkään selaimessa (ts. muutoksesta halutaan pysyvä), silloin on tarpeen tehdä muutos kuvantarjoajan (tässä serveri) päässä (eli esimerkiksi ylläolevalla skriptillä, tapoja on monia).


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta