Verzeichnisstruktur phpBB-3.3.16


Veröffentlicht
27.04.2026

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

TypeWebp.php

Zuletzt modifiziert: 01.05.2026, 11:27 - Dateigröße: 3.34 KiB


 001  <?php
 002   
 003  /**
 004   * fast-image-size image type webp
 005   * @package fast-image-size
 006   * @copyright (c) Marc Alexander <admin@m-a-styles.de>
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  namespace FastImageSize\Type;
 013   
 014  use FastImageSize\ImageReader;
 015   
 016  class TypeWebp extends TypeBase
 017  {
 018      /** @var string RIFF header */
 019      const WEBP_RIFF_HEADER = "RIFF";
 020   
 021      /** @var string Webp header */
 022      const WEBP_HEADER = "WEBP";
 023   
 024      /** @var string VP8 chunk header */
 025      const VP8_HEADER = "VP8";
 026   
 027      /** @var string Simple(lossy) webp format */
 028      const WEBP_FORMAT_SIMPLE = ' ';
 029   
 030      /** @var string Lossless webp format */
 031      const WEBP_FORMAT_LOSSLESS = 'L';
 032   
 033      /** @var string Extended webp format */
 034      const WEBP_FORMAT_EXTENDED = 'X';
 035   
 036      /** @var int WEBP header size needed for retrieving image size */
 037      const WEBP_HEADER_SIZE = 30;
 038   
 039      /** @var array Size info array */
 040      protected $size;
 041   
 042      /**
 043       * {@inheritdoc}
 044       */
 045      public function getSize(string $filename, ImageReader $imageReader): ?array
 046      {
 047          // Do not force length of header
 048          $data = $imageReader->getImage($filename, 0, self::WEBP_HEADER_SIZE);
 049   
 050          if ($data === false)
 051          {
 052              return null;
 053          }
 054   
 055          $this->size = array();
 056   
 057          $webpFormat = substr($data, 15, 1);
 058   
 059          if (!$this->hasWebpHeader($data) || !$this->isValidFormat($webpFormat))
 060          {
 061              return null;
 062          }
 063   
 064          $data = substr($data, 16, 14);
 065   
 066          $this->setWebpSize($data, $webpFormat);
 067          $this->size['type'] = IMAGETYPE_WEBP;
 068   
 069          return $this->size;
 070      }
 071   
 072      /**
 073       * Check if $data has valid WebP header
 074       *
 075       * @param string $data Image data
 076       *
 077       * @return bool True if $data has valid WebP header, false if not
 078       */
 079      protected function hasWebpHeader(string $data): bool
 080      {
 081          $riffSignature = substr($data, 0, self::LONG_SIZE);
 082          $webpSignature = substr($data, 8, self::LONG_SIZE);
 083          $vp8Signature = substr($data, 12, self::SHORT_SIZE + 1);
 084   
 085          return !empty($data) && $riffSignature === self::WEBP_RIFF_HEADER &&
 086              $webpSignature === self::WEBP_HEADER && $vp8Signature === self::VP8_HEADER;
 087      }
 088   
 089      /**
 090       * Check if $format is a valid WebP format
 091       *
 092       * @param string $format Format string
 093       * @return bool True if format is valid WebP format, false if not
 094       */
 095      protected function isValidFormat(string $format): bool
 096      {
 097          return in_array($format, array(self::WEBP_FORMAT_SIMPLE, self::WEBP_FORMAT_LOSSLESS, self::WEBP_FORMAT_EXTENDED));
 098      }
 099   
 100      /**
 101       * Get webp size info depending on format type and set size array values
 102       *
 103       * @param string $data Data string
 104       * @param string $format Format string
 105       */
 106      protected function setWebpSize(string $data, string $format): void
 107      {
 108          switch ($format)
 109          {
 110              case self::WEBP_FORMAT_SIMPLE:
 111                  $this->size = unpack('vwidth/vheight', substr($data, 10, 4));
 112              break;
 113   
 114              case self::WEBP_FORMAT_LOSSLESS:
 115                  // Lossless uses 14-bit values so we'll have to use bitwise shifting
 116                  $this->size = array(
 117                      'width'        => ord($data[5]) + ((ord($data[6]) & 0x3F) << 8) + 1,
 118                      'height'    => (ord($data[6]) >> 6) + (ord($data[7]) << 2) + ((ord($data[8]) & 0xF) << 10) + 1,
 119                  );
 120              break;
 121   
 122              case self::WEBP_FORMAT_EXTENDED:
 123                  // Extended uses 24-bit values cause 14-bit for lossless wasn't weird enough
 124                  $this->size = array(
 125                      'width'        => ord($data[8]) + (ord($data[9]) << 8) + (ord($data[10]) << 16) + 1,
 126                      'height'    => ord($data[11]) + (ord($data[12]) << 8) + (ord($data[13]) << 16) + 1,
 127                  );
 128              break;
 129          }
 130      }
 131  }
 132