Что может вызвать ошибку «цветовой индекс вне диапазона» для imagecolorsforindex ()? - PullRequest
5 голосов
/ 06 октября 2010

При изменении размера патча для большого количества файлов JPG, PNG и GIF, PHP неожиданно замирает с сообщением об ошибке:

imagecolorsforindex () [function.imagecolorsforindex]: Индекс цвета 226 вне диапазона

Соответствующий фрагмент кода:

protected function preserveTransparency($img, $resized, $ftype) {

    if (($ftype == IMAGETYPE_PNG) || ($ftype == IMAGETYPE_GIF)) {
        $tidx = imagecolortransparent($img);
        if ($tidx >= 0) {
          $transColor = imagecolorsforindex($img, $tidx);
          $tidx = imagecolorallocate($resized, $transColor['red'], $transColor['green'], $transColor['blue']);
          imagefill($resized, 0, 0, $tidx);
          imagecolortransparent($resized, $tidx);
        } elseif ($ftype == IMAGETYPE_PNG) {
            imagealphablending($resized, false);
            imagesavealpha($resized, true);
            $transparent = imagecolorallocatealpha($resized, 255, 255, 255, 127);
            imagefill($resized, 0, 0, $transparent);
        }
    }
}

Как может отсутствовать индекс цвета, если он уже был возвращен imagecolortransparent?

1 Ответ

9 голосов
/ 10 октября 2010

Похоже, что индекс, возвращаемый imagecolortransparent($img), больше, чем размер поддона рассматриваемого изображения.

Индекс цвета прозрачности является свойством изображения, а не свойством поддона, поэтому возможно, что изображение может быть создано с этим индексом, установленным за пределами размера поддона, но я бы надеялся, что PHP будет обнаружил это и вернул -1 из imagecolortransparent() в этой ситуации.

Вы можете проверить, происходит ли это, добавив вызов к imagecolorstotal в свой код:

    $tidx = imagecolortransparent($img);
    $palletsize = imagecolorstotal($img);
    if ($tidx >= 0 && $tidx < $palletsize) {
      $transColor = imagecolorsforindex($img, $tidx);
...