Avatar
Igor Plastelína:

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:

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
tomasmanhal
Člen
Avatar
Odpovídá na Igor Plastelína
tomasmanhal:

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
Kdyby nám dodali k životu zdrojový kód, vše by bylo jednodušší...
Avatar
kxmx
Redaktor
Avatar
kxmx:

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 tomasmanhal
Igor Plastelína:

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
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na kxmx
Matúš Petrofčík:

: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
Matúš Petrofčík
Šéfredaktor
Avatar
Odpovídá na Igor Plastelína
Matúš Petrofčík:

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  +1 18.2.2015 23:29
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Igor Plastelína:
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.