Manipulace s obrázky [Nový ImageStorage]

flexroad
Člen | 117
+
+1
-

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
+
0
-

@Antik Přidávám se s prosbou o fix

Editoval Beton (5. 3. 2015 9:54)

Pavel Janda
Člen | 977
+
0
-

@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
+
0
-

@Beton Bohužel tento týden nemám vůbec čas. Budu rád, pokud pošleš pull na gitu.

mamiksik
Člen | 2
+
0
-

Ahoj, Plánuješ podporu pro texy?

Martk
Člen | 661
+
0
-

@mamiksik Ano, v příští verzi bude podpora pro texy.

mamiksik
Člen | 2
+
0
-

@Antik super dost mi to usnadní život :). Kdy to tak asi bude?

Burák
Člen | 2
+
0
-

Ahoj, chci se zeptat, je nějak možné při volání {img 'images/image.png', '460x230', 'exact'} zrušit centrování a napozicovat si obrázek jinak?
Díky

Martk
Člen | 661
+
0
-

@Burák Funkce crop momentálně nejde použít v makrech.

Martk
Člen | 661
+
0
-

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)'">
Pavel Janda
Člen | 977
+
0
-

@Antik Pushnes, prosím, tag 1.3 na GitHub?

Martk
Člen | 661
+
0
-

@Beton Díky, nahozeno.

papajda
Člen | 6
+
0
-

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;
Martk
Člen | 661
+
0
-

@papajda Jedná se o starší verzi. V aktuální verzi je to opraveno.

papajda
Člen | 6
+
0
-

Ve verzi 1.3 mi to stále nefunguje.

$form->addImageUpload('file', 'Soubor')->setNamespace('files')->addRule(Form::MAX_FILE_SIZE, 'Překročena maximální velikost souboru', 500 * 1024);
Martk
Člen | 661
+
0
-

@papajda dobrá mrknu na to, mám v tom celkem guláš, protože to mám rozsekané v různých složkách. Díky za příspěvek.

papajda
Člen | 6
+
0
-

Dobře díky :)

Pavel Janda
Člen | 977
+
0
-

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)

Martk
Člen | 661
+
0
-

@papajda V dev verzi by to mělo být opravené pro nette 2.3.1.

@Beton V makru je přidána kvalita jako 4 parametr. Lze měnit kvalitu i originálních obrázku, kterém se uloží do zvláštní podsložky.

papajda
Člen | 6
+
0
-

Bohužel se to vrátilo k
Call to a member function isImage() on a non-object

Martk
Člen | 661
+
0
-

@papajda Bohužel nevím kde by mohla být chyba v dev verzi přesměrovávám originální validační pravidla z validatoru na vlastní třídu (Dokonce jsem to zkoušel i na verzi 2.3 a 2.3.1).

papajda
Člen | 6
+
0
-

Ukázal by jsi mi kód?

papajda
Člen | 6
+
0
-

Ja myslel použití :D ale už se to rozběhlo :) Díky

flexroad
Člen | 117
+
0
-

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
+
0
-

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
+
0
-

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/exact

a maska routy:
show-image/<name>[/<size>[/<flag>[/<noimage>]]]

Super. Krasne a ciste reseni. To mam rad.

Diky MOC!

flexroad
Člen | 117
+
0
-

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
+
0
-

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
+
+1
-

@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
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

@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
+
0
-

Po composer update prestal fungovat, ale po promazani „vendor“ a opetovnem composer install → update se rozbehl a vypada to, ze dela PRESNE to co jsem od nej ocekaval. Klobouk dolu!

@flexroad

flexroad
Člen | 117
+
0
-

@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
+
0
-

@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
+
0
-

@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
+
+1
-

@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
+
0
-

@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 ;)

Martk
Člen | 661
+
+2
-

@Lexi Díky! Opraveny chyby, přidány testy a přidán setter setPreviewSize.

Jan Mikeš
Člen | 771
+
0
-

@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

Martk
Člen | 661
+
+1
-

@Lexi Je to tam.

flexroad
Člen | 117
+
0
-

@Antik – jsi borec!!! Diky za to!!!

jakub.barta
Člen | 10
+
0
-

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
+
+3
-

@jakub.barta metody trait muzes aliasovat: http://php.net/…5.traits.php#…

use TPresenter {
	TPresenter::createTemplate as imageCreateTemplate;
}

protected function createTemplate()
{
	$template = $this->imageCreateTemplate();
	....
}
jakub.barta
Člen | 10
+
0
-

Clovek se dozvida nove veci kazdy den… Diky za info, PR zavren.

Martk
Člen | 661
+
0
-

Vydal jsem novou verzi, která je velmi skromná, ale obsahuje rozšíření, které mi celkem chybělo a to udělat z obrázkového uploadu povinnou položku. Když je povinná položka zobrazí se zaškrtávací tlačítko + pole pro nahrání obrázku + náhled.

Jan Mikeš
Člen | 771
+
+1
-

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)

Martk
Člen | 661
+
0
-

@Lexi Používám doctrinu a něco takového by se mi hodilo. Jestli to hodíš na git, tak bych to použil.

Jan Mikeš
Člen | 771
+
0
-

@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 ;)