height >= ($image->width * Photo::ALLOWED_SIDE_MULTIPLIER)) || ($image->width >= ($image->height * Photo::ALLOWED_SIDE_MULTIPLIER))) throw new ISE("Invalid layout: image is too wide/short"); $image->save($this->pathFromHash($hash), 92, Image::JPEG); return true; } function crop(real $left, real $top, real $width, real $height): void { if(isset($this->changes["hash"])) $hash = $this->changes["hash"]; else if(!is_null($this->getRecord())) $hash = $this->getRecord()->hash; else throw new ISE("Cannot crop uninitialized image. Please call setFile(\$_FILES[...]) first."); $image = Image::fromFile($this->pathFromHash($hash)); $image->crop($left, $top, $width, $height); $image->save($this->pathFromHash($hash)); } function isolate(): void { if(is_null($this->getRecord())) throw new ISE("Cannot isolate unpresisted image. Please save() it first."); DB::i()->getContext()->table("album_relations")->where("media", $this->getRecord()->id)->delete(); } function getDimensions(): array { $x = $this->getRecord()->width; $y = $this->getRecord()->height; if(!$x) { # no sizes in database $hash = $this->getRecord()->hash; $image = new \Imagick($this->pathFromHash($hash)); $x = $image->getImageWidth(); $y = $image->getImageHeight(); $this->stateChanges("width", $x); $this->stateChanges("height", $y); $this->save(); } return [$x, $y]; } function getAlbum(): ?Album { return (new Albums)->getAlbumByPhotoId($this); } function toVkApiStruct(): object { $res = (object) []; $res->id = $res->pid = $this->getId(); $res->owner_id = $res->user_id = $this->getOwner()->getId()->getId(); $res->aid = $res->album_id = NULL; $res->width = $this->getDimensions()[0]; $res->height = $this->getDimensions()[1]; $res->date = $res->created = $this->getPublicationTime()->timestamp(); $res->src = $res->src_small = $res->src_big = $res->src_xbig = $res->src_xxbig = $res->src_xxxbig = $res->photo_75 = $res->photo_130 = $res->photo_604 = $res->photo_807 = $res->photo_1280 = $res->photo_2560 = $this->getURL(); return $res; } static function fastMake(int $owner, string $description = "", array $file, ?Album $album = NULL, bool $anon = false): Photo { $photo = new static; $photo->setOwner($owner); $photo->setDescription(iconv_substr($description, 0, 36) . "..."); $photo->setAnonymous($anon); $photo->setCreated(time()); $photo->setFile($file); $photo->save(); if(!is_null($album)) $album->addPhoto($photo); return $photo; } }