Manipulace s obrázky [Nový ImageStorage]

- flexroad
- Člen | 117
Ahoj,
po update na nette 2.3.0 chyba NA TOMTO RADKU
Undefined variable: builder
staci prepsat na:
$config['wwwDir'] = Nette\DI\Helpers::expand($config['wwwDir'], $this->getContainerBuilder()->parameters);
Da se s tim neco udelat?
EDIT:
Uz jsem udelal fork!
Diky,
@flexroad
Editoval flexroad (2. 3. 2015 13:12)

- Pavel Janda
- Člen | 977
@Antik Webchemistry vůbec nějak na Nette 2.3 nefunguje.
Při uploadu:
Fatal Error
Call to a member function isImage() on string
Source file:
/**
318: * Is file image?
319: * @return bool
320: */
321: public static function validateImage(Controls\UploadControl $control)
322: {
323: foreach (static::toArray($control->getValue()) as $file) {
!!324: if (!$file->isImage()) {
325: return FALSE;
326: }
327: }
328: return TRUE;
Ve Nette verzi 2.2.7 se tato metoda vůbec nevolala, tolik info.
Editoval Beton (6. 3. 2015 14:07)

- Martk
- Člen | 661
Verze 1.3
- Přidán MultiUpload (Vyžaduje Kdyby Replicator)
- Přidána podpora pro Texy!
- Přidána crop funkce v makrech.
- Automatická registrace formulářových prvků v DI kontejneru. Nastavit lze v configu.
- Odstraněny některé chyby.
Ukázka obrázku v Texy:
[img namespace/image.png, 200x100, exact]:(alt = Popis obrázku, class = img-responsive img-circle)
Ukázka použití crop v makru:
<img n:img="'namespace/image.png', 'crop(50%,20,100%,500)'">
<img n:img="'namespace/image.png', 'crop(100,20,200,500)'">

- papajda
- Člen | 6
Ahoj,
při uploadu mi nefungujou validační pravidla (nette 2.3)
Call to a member function getSize() on a non-object
243: /**
244: * Is file size in limit?
245: * @return bool
246: */
247: public static function validateFileSize(Controls\UploadControl $control, $limit) {
248: foreach (static::toArray($control->getValue()) as $file) {
249: if ($file->getSize() > $limit || $file->getError() === UPLOAD_ERR_INI_SIZE) {
250: return FALSE;
251: }
252: }
253: return TRUE;

- Pavel Janda
- Člen | 977
Zdravím,
není možné určit kvalitu komprimace při zmenšování obrázku. Docela se mi nelíbí, že se defaultně používá 80% komprese, která je ještě nastavená skrze Nette/Utils/Image.
Edit:
Pošlu klidně pull-request, jakmile to dokážu rozchodit na Nette 2.3,
bohužel to zatím chcípá.
Editoval Beton (25. 3. 2015 15:01)

- flexroad
- Člen | 117
Ahoj,
poradi nekdo jak pouzit routu s namespace?
Kdyz zavolam
http://www.mujserver.lc/…00x300/exact
hodi mi chybu tento radek:
Call to a member function isImageExists() on a non-object
muj neon:
images:
wwwDir: %wwwDir%
assetsDir: ‚uploads‘
noimage: ‚noimage/noimage.png‘
settings:
upload:
label: ‚Delete this image?‘
router:
mask:
„show-image/<namespace>/<name>[/<size>[/<flag>[/<noimage>]]]“
resize: no # Disallow create resized image
flag: 0
disable: no
Diky,
@flexroad
Editoval flexroad (2. 4. 2015 13:51)

- Martk
- Člen | 661
parameter namespace v routě neexistuje. Parameter name je absolutní jméno pro obrázek tzn. namespace + jméno obrázku. Lomítka a tečky jsou nahrazené za dovojtečky (může se změnit), kvůli .htaccess (lze k tomu použit funkce WebChemistry\Images\Router\Helper::encodeName).
Takže url by měla vypadat
http://www.mujserver.lc/show-image/news:mujobrazek:png/1200x300/exact
a maska routy:
show-image/<name>[/<size>[/<flag>[/<noimage>]]]

- flexroad
- Člen | 117
Antik napsal(a):
parameter namespace v routě neexistuje. Parameter name je absolutní jméno pro obrázek tzn. namespace + jméno obrázku. Lomítka a tečky jsou nahrazené za dovojtečky (může se změnit), kvůli .htaccess (lze k tomu použit funkce WebChemistry\Images\Router\Helper::encodeName).
Takže url by měla vypadat
http://www.mujserver.lc/show-image/news:mujobrazek:png/1200x300/exacta maska routy:
show-image/<name>[/<size>[/<flag>[/<noimage>]]]
Super. Krasne a ciste reseni. To mam rad.
Diky MOC!

- flexroad
- Člen | 117
Ahoj,
narazil jsem na VELMI zvlastni chybu…pri pokusu zobrazit dve ruzne velikosti vygenerovanych nahledu…
Takto si nahraju obrazky a vygeneruju dve potrebne velikosti nahledu:
$upload = $this->imageStorage->fromUpload($fileUpload, 'profiles');
$name = $upload->save();
$superSmallPicturePath = $this->imageStorage->create($name, '70x70', 'exact')->createLink();
$smallPicturePath = $this->imageStorage->create($name, '150x150', 'exact')->createLink();
Pokud potom otevru url: „/show-image/profiles:123:jpg/70×70/exact“
, obrazek se sice v prohlizeci zobrazi, ale v konzoli vidim error 500 a
v logu vidim,
Page not found. Missing template
‚…\vendor\webchemistry\images\src\templates\Generate\default.latte‘
Pokud ale otevru url: „/show-image/profiles:123:jpg/150×150/exact“, vse se zobrazi bez chyby a v poradku…
No toto proste NECHAPU!!!
Nejake napady?
@flexroad
/show-image/profiles:123:jpg/150×150/

- flexroad
- Člen | 117
Ahoj,
poradi mi nekdo prosim, jak otevrit existujici obrazek ulozeny v namespace „test“?
Zkousim metodu fromContent(), ale nemuzu prijit na to co ji predat, aby to vratilo kyzeny obrazek.
Obrazek ukladam takto:
$fileUpload = new FileUpload([
'name' => $filename,
'type' => $type,
'tmp_name' => $tmp_name,
'size' => $size,
'error' => $error,
]);
$upload = $this->imageStorage->fromUpload($fileUpload, 'test');
$name = $upload->save();
coz ulozi ve slozce „upload/test/original“ muj nahravany soubor.
Otevrit soubor se snazim takto:
$obrazek = $imageStorage->fromContent(‚obrazek.jpg‘, ‚obrazek.jpg‘,
‚test‘);
Objekt obrazek ale neobsahuje zadne informace o obrazku, jako treba vysku, sirku…atd.
Diky za cokoliv!!!
@flexroad

- Martk
- Člen | 661
@flexroad Myslím, že potřebuješ toto:
/** @var WebChemistry\Images\Image\Image $image */
$image = $this->imageStorage->create('test/obrazek.jpg');
/** @var WebChemistry\Images\Image\Info $info */
$info = $image->createImageInfo();
V nejbližší době budu trošku upravovat tuto komponentu a přejmenuji některé funkce (Staré budou deprecated)

- flexroad
- Člen | 117
Ahoj,
zase ja. Resim orezavani obrazku v prezenteru. Mam problem, pokud potrebuju obrazku zmenit velikost a zaroven nastavit pozici crop.
Dejme tomu, ze obrazek ma v originalu 500×1000px
Potrbeuju zmenit na obrazek o velikosti 200×100 a crop ramecek nastavit uplne nahoru doleva misto soucasneho stredu.
Zkousel jsem
$image = $this->imageStorage->create('test/'.$imageName);
$image->setWidth(200); // nic neudela :(
$cropped = $image->setSize("crop(0,0,200,100)")->createLink();
Ale obrazek se jen orizne bez zmenseni – ja bych ho ale potreboval jeste pred orezem resiznout na kyzenych 200px na sirku.
Poradi nekdo?
@flexroad

- flexroad
- Člen | 117
flexroad napsal(a):
Ahoj,
zase ja. Resim orezavani obrazku v prezenteru. Mam problem, pokud potrebuju obrazku zmenit velikost a zaroven nastavit pozici crop.
Dejme tomu, ze obrazek ma v originalu 500×1000px
Potrbeuju zmenit na obrazek o velikosti 200×100 a crop ramecek nastavit uplne nahoru doleva misto soucasneho stredu.
Zkousel jsem
$image = $this->imageStorage->create('test/'.$imageName); $image->setWidth(200); // nic neudela :( $cropped = $image->setSize("crop(0,0,200,100)")->createLink();Ale obrazek se jen orizne bez zmenseni – ja bych ho ale potreboval jeste pred orezem resiznout na kyzenych 200px na sirku.
Poradi nekdo?
@flexroad
Nejake napady? Nebo se mam pustit do prepisovani?

- Martk
- Člen | 661
Do doby než dodělám tu novou verzi, tak by mělo pomoc přepsání z else if na if. (Bohužel se nevytvoří složka x200-crop*, ale jenom crop*)
https://github.com/…ge/Image.php#L46
Editoval Antik (28. 5. 2015 9:45)

- Martk
- Člen | 661
@flexroad Momentálně jsem vydal novou verzi. Obsahuje syntaxi helperů jako v latte.
Pro tvůj účel:
$imageStorage->getLink('test/'.$imageName, '200x100|crop:0,0,200,100'));
Lze aplikovat vlastní helpery a více helperů najednou. Obsah základních helperů je tady: https://github.com/…n/HELPERS.md

- flexroad
- Člen | 117
@Antik : Zatim vsechno slape jak ma krome jedne veci… Jen nevim, jestli to je bug, nebo jestli neco delam spatne.
Pokud neexistuje obrazek, zobrazi se misto nej /uploads/noimage/original/noimage.png a to i kdyz po nem chci nejakou konkretni velikost, napriklad:
{img 'profiles/neexistujiciobrazek.jpg', '70x70', 'exact'}
Delam neco spatne? V puvodni verzi to noimage.png v pohode resizovalo.
Diky,
@flexroad
Editoval flexroad (3. 6. 2015 14:13)

- Jan Mikeš
- Člen | 771
@Antik lze nějak jednoduše upravit velikost náhledu, která se
automaticky generuje při použití $form->addImageUpload()? Ono
asi není úplně žádoucí, aby se mi zobrazovaly fotky v plném rozlišení
přímo ve formuláři :).
Dívál jsem se do implementace, a asi to vyřeším přes css max-height na
třídu upload-preview-image ale nezdá se mi to jako nejlepší
řešení.
Osobně bych navrhoval přidat setter setPreviewDimensions()
nebo setPreviewSize().
Implementace by neměla být složitá, pokud chceš mohl bych zkusit nachystat PR.
Jinak fakt výborný doplněk a od jeho nejistých začátků, kdy měl spoustu chyb a nedokonalostí ušel dlouhou cestu!!

- Jan Mikeš
- Člen | 771
@Antik při tomto kódu
$form->addImageUpload("image", "Fotografie")
->setDefaultValue($contact->image)
->setNamespace("contact");
Uploadnu img (ten se uploadne správně) do složky contact/original, ale dostávám špatnou value z formu:
public function process($form, $values)
{
var_dump($values);
$stop();
Nette\Utils\ArrayHash #0129
image => "contactupload.jpg"
Chybí tam lomítko, jedná se o bug nebo špatné použití u mě? Jakmile v DB upravim záznam (to lomítko tam přidám) tak je to ok

- Martk
- Člen | 661
@flexroad Díky moc! Opraveno a přidány testy.
@Lexi Mě to bohatě stačilo, protože jsem nastavil rezponzivní obrázek a max-width, takže obrázek nebyl příliš velký, nepřesahoval obrazovku a navíc jsem na to už nemusel znova šáhnout. Ale myslím, že nastavení požadované velikosti by nebylo úplně naškodu.
Tohle chování by nemělo být, podívám se na to a v nejbližší době pošlu commit.
Jinak díky, ale ještě tento projde řadou změn. Překopání doplňků + přidání testů a vytvořit konektory pro online úložiště.
Editoval Antik (5. 6. 2015 9:27)

- Jan Mikeš
- Člen | 771
@Antik ještě jednu chybičku jsem našel, v dokumentaci je 2× uveden příklad s tímto pořadí parametrů:
$form->addImageUpload('upload2', 'Upload 2', $row->upload, 'namespace');
Ve skutečnosti ale jsou parametry image a namespace naopak, takže pokud
člověk nevyužívá metody setDefaultValue() a
setNamespace() tak to může zamotat hlavu ;)

- Jan Mikeš
- Člen | 771
@Antik díky moc, skvělá práce! Šlo by ještě aktualizovat composer? https://packagist.org/…istry/images dev-master ukazuje stejný commit jako 1.4

- jakub.barta
- Člen | 10
Zdravim a diky za skvely addon, hodne mi ulehcil praci.
Jedina drobnost, ktera mi ztrpcovala zivot, byla ta, ze si v presenteru, ktery
ma trait TPresenter a ktery injectuje storage do sablony, nemuzu hrat s metodou
createTemplate(), protoze metoda presenteru by prekryla metodu traitu a tedy by
se nic neinjectnulo.
Vyresil jsem to pres udalost onTemplateCreated, ktera se vola pote, co trait sablonu vytvori.
Na GH jsem poslal PR.
Diky za vyjadreni a pripadny merge, dost mi to pomuze.

- David Matějka
- Moderator | 6445
@jakub.barta metody trait muzes aliasovat: http://php.net/…5.traits.php#…
use TPresenter {
TPresenter::createTemplate as imageCreateTemplate;
}
protected function createTemplate()
{
$template = $this->imageCreateTemplate();
....
}

- Jan Mikeš
- Člen | 771
Pokud někdo používá tento doplněk společně s doctrine, napsal jsem si jednoduchý subscriber pro Kdyby\Events, který smaže obrázek v případě že je použit u entity, která je smazána, použití je pak naprosto triviální:
/**
* @ORM\Column(nullable=true)
* @App\Annotations\Image // Díky této anotaci se při "preRemove" eventu smaže obrázek z disku
*/
protected $image;
Kdyby někdo měl zájem, rád nahodím na github a o řešení se podělím, případně napíšu jednoduchou extension, která by umožnila automatickou instalaci subscriberu atd… jako balíček pro composer
Editoval Lexi (28. 7. 2015 15:59)

- Jan Mikeš
- Člen | 771
@Antik https://github.com/…aticDeletion mělo by z toho být vše zřejmé, přes víkend k tomu dopíšu extension a hodím do composeru ;)