[ 'load' => 'imagecreatefromjpeg', ], IMAGETYPE_PNG => [ 'load' => 'imagecreatefrompng', ], IMAGETYPE_GIF => [ 'load' => 'imagecreatefromgif', ], IMAGETYPE_WEBP => [ 'load' => 'imagecreatefromwebp', ] ]; public function __construct($idir, $tdir, $width, $heigth) { $this->imagedir = $idir; $this->thumbdir = $tdir; $this->w = $width; $this->h = $heigth; } public function get_thumb($iname) { $src = $this->imagedir.$iname; $dstname = hash('sha256', $src); $dstpath = $this->thumbdir.$dstname.'.jpg'; if (!file_exists($dstpath)) { if(str_starts_with(mime_content_type($src), 'video/')) { $cmd = $this->ffprobe_cmd.' -i "'.$src.'" -show_entries format=duration -v quiet -of csv="p=0"'; exec($cmd, $output, $retval); $seconds = ($output[0]*10) / 100; $cmd = $this->ffmpeg_cmd.' -i "'.$src.'" -an -ss '.$seconds.' -t 00:00:01 -vf scale=w='.$this->w.':h='.$this->h.':force_original_aspect_ratio=decrease -r 1 -y -vcodec mjpeg -f mjpeg '.$dstpath.' 2>&1'; exec($cmd, $output, $retval); if ($retval) { return "img/video.png"; } else { return $dstpath; } } $type = exif_imagetype($src); if ($type == 0) { error_log("$src: Unknown Image Type"); return "img/error.png"; } $image = call_user_func(self::IMAGE_HANDLERS[$type]['load'], $src); if ($image == false) { error_log("$src: Image Loading Failed"); return "img/error.png"; } $srcwidth = imagesx($image); $srcheight = imagesy($image); $ratio = min($this->w / $srcwidth, $this->h / $srcheight); $width = round($srcwidth*$ratio); $height = round($srcheight*$ratio); $thumbnail = imagecreatetruecolor($width, $height); if ($type == IMAGETYPE_GIF || $type == IMAGETYPE_PNG) { imagecolortransparent($thumbnail, imagecolorallocate($thumbnail, 0, 0, 0)); if ($type == IMAGETYPE_PNG) { imagealphablending($thumbnail, false); imagesavealpha($thumbnail, true); } } imagecopyresampled($thumbnail, $image, 0, 0, 0, 0, $width, $height, $srcwidth, $srcheight); call_user_func('imagejpeg',$thumbnail,$dstpath,100); imagedestroy($image); imagedestroy($thumbnail); } return $dstpath; } } ?>