Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Změna opacity pomocí PHP

Aktivity
Avatar
Igor Plastelína:18.2.2015 23:01

Dobrý den, už pár hodin se snažím v PHP udělat z PNG s transparentním pozadím obrázek s transparentním pozadím + opacity na 50% a stále se mi to nedaří... používám Nette, ale není to podmínkou.

public function mujtopformeuSuccess(Form $form){     $data = $form->getValues();     if(is_object($data->image) && $data->image->getName() != NULL)     {           // uložím si obrázek na server ulozim ho do utils\image, zmenším a zase uložím          $data->image->move("image.png", 100, Image::PNG);          $img = Image::fromFile("image.png");          $img->resize(28, NULL);           $img->save("min_image.png", 100, Image:PNG);          // 1. obrázek je v pořádku a rdy na použití                    // teď potřebuju nový obrázek (prázdný s transparentním pozadím) a do něj vložím můj obrázek s opacity na 50%          $newimg = Image::fromBlank($img->getWidth(), $img->getHeight(), Image::rgb(255, 255, 255, 127));          $newimg->place($img, 0, 0, 50); // na pozici 0 left 0 top a 50% opacity -> zničí obrázek          $newimg->save("tmin_image.png", 100, Image::PNG);  // ukládá se už pokažený     }}

Jde o to, že nahraju obrázek na server, pak ho hodím do Utils\Image a zmenším ho.. a znovu si ho uložím. Potom ten stejný obrázek chci ještě jednou ale aby byl průhledný na 50%.. potom co si vytvořím nový obrázek (ten je v pořádku) a snažím se do nej vecpat můj menší obrázek (ten je taky v pořádku), tak při zavolání metody place se mi najednou udělá obrázek s černým pozadím... ale obrázek má opacity 50%.. to je sice hezký ale já potrebuju aby měl i transparentní pozadí.. ne černou. Nevěděl by mi někdo poradit co s tím?Zkoušel jsem i různé knihovny, bez knihoven.. šťourat se v Nette, ale vždy tam to pozadí je prostě černý. Abych se vyvaroval otázkám proč to vůbec potřebuji a nepoužiji až CSS, tak proto, že ty obrázky jsou marky do google maps api a tam si upravovat marky csskem nemůžu. Externí knihovny jsem zkoušel : wideimage a phpimageworkshop­.Předem díky za pomoc.

Editováno 18.2.2015 23:02
 
Odpovědět
18.2.2015 23:01
Avatar
Igor Plastelína:18.2.2015 23:07

Ještě dodám, že se obrázek nepokazí u metody resize.. pokud budete googlit jako já tak ten problém je časo právě tady a musí se obalit přes

$img->alphaBlending(true);
$img->resize();
$img->alphaBlending(false);
$img->saveAlpha(true);
$img->save(..);

Ale s tím já problém nemám.

 
Nahoru Odpovědět
18.2.2015 23:07
Avatar
Odpovídá na Igor Plastelína
Tomáš Maňhal:18.2.2015 23:07

A co ImageMagick? Je o něm zmínka přímo v dokumentaci PHP.

http://php.net/…eopacity.php

Pomocí něj by to nešlo?

 
Nahoru Odpovědět
18.2.2015 23:07
Avatar
kxmx
Tvůrce
Avatar
kxmx:18.2.2015 23:09

neraďte mu to je ten nepříjemnej rusák co tu minule spamoval scriptem

 
Nahoru Odpovědět
18.2.2015 23:09
Avatar
Odpovídá na Tomáš Maňhal
Igor Plastelína:18.2.2015 23:16

To jsem zkoušel jako první, Imagick na serveru nemáme a já to tam težko doinstaluju. Myslím si ale, že dělám někde chybu já.. není možné aby bylo 10 způsobů nefunkčních.

 
Nahoru Odpovědět
18.2.2015 23:16
Avatar
Odpovídá na kxmx
Matúš Petrofčík:18.2.2015 23:25

:D no ak mu to zlepšuje život, tak prečo nie :D

Nahoru Odpovědět
18.2.2015 23:25
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Igor Plastelína
Matúš Petrofčík:18.2.2015 23:29

Nemám chuť to riešiť, ale nebude problém v tom, že keď sa vytvorí nový obrázok do ktorého sa ukladajú dáta toho zmenšeného a 50% priesvitného (predpripraví obrázok/string do ktorého sa potom vkladá ďalší obrázok/zdrojový string), tak ten je defaultne po vytvorení čierny? Napr. imagecreatetru­ecolor(xyz) vytvára zdrojový obrázok, akoby formičku, ktorá je defaultne celá čierna... a do toho sa vloží zdroj toho obrázku ktorý sa uploadol, ale to pôvodne priesvitné ostane čierne... asi som to nepopísal najlepšie ale dúfam že to pochopíte, nemám teraz mozog v 100% triezvom stave.

Nahoru Odpovědět
18.2.2015 23:29
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Igor Plastelína:18.2.2015 23:45
public static function fromBlank($width, $height, $color = NULL)        {               if (!extension_loaded('gd')) {                  throw new Nette\NotSupportedException('PHP extension GD is not loaded.');               }               $width = (int) $width;          $height = (int) $height;                if ($width < 1 || $height < 1) {                        throw new Nette\InvalidArgumentException('Image width and height must be greater than zero.');          }               $image = imagecreatetruecolor($width, $height);         if (is_array($color)) {                 $color += array('alpha' => 0);                  $color = imagecolorallocatealpha($image, $color['red'], $color['green'], $color['blue'], $color['alpha']);                      imagealphablending($image, FALSE);                      imagefilledrectangle($image, 0, 0, $width - 1, $height - 1, $color);                    imagealphablending($image, TRUE);               }               return new static($image);      }public function place(Image $image, $left = 0, $top = 0, $opacity = 100)       {               $opacity = max(0, min(100, (int) $opacity));            if (substr($left, -1) === '%') {                        $left = round(($this->getWidth() - $image->getWidth()) / 100 * $left);          }               if (substr($top, -1) === '%') {                 $top = round(($this->getHeight() - $image->getHeight()) / 100 * $top);          }               if ($opacity === 100) {                 imagecopy(                              $this->image, $image->getImageResource(),                               $left, $top, 0, 0, $image->getWidth(), $image->getHeight()                      );              } elseif ($opacity <> 0) {                      imagecopymerge(                         $this->image, $image->getImageResource(),                               $left, $top, 0, 0, $image->getWidth(), $image->getHeight(),                             $opacity                        );              }               return $this;   }
 
Nahoru Odpovědět
18.2.2015 23:45
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.