Это приложение написано мной, я протестировал его на своем локальном компьютере, и изображение, сгенерированное моим приложением, отлично работает без ошибок на моем локальном сервере разработки. Мое приложение представляет собой API, пользователь использует его для создания мозаичного изображения. Он в основном использует библиотеку PHP Image GD.
Проблема: сгенерированное изображение имеет правую и нижнюю черные границы шириной в один пиксель, но это происходит только на рабочем сервере, а не на моем локальном сервере. Граница создается только тогда, когда изображение прозрачное (в моем случае: «контур», «инверсия», «черный» тип изображения. Посмотрите на код ниже). Но иногда граница в основном есть, а иногда нет.
Я совершенно уверен, что с моим кодом все в порядке, и мое приложение работает безупречно. Я протестировал обе среды с одним и тем же типом изображения, одним и тем же размером, с одинаковой конфигурацией для моего приложения... и тем не менее рабочий сервер генерирует изображение с границей.
Вот фрагмент кода моего приложения, на который стоит посмотреть с подозрением:
$src = $img->filePath;
$src_outline = $img->filePathComplements['outline'];
$src_invert = $img->filePathComplements['invert'];
$src_black = $img->filePathComplements['black'];
$info_text = is_array($img->info) ? join($img->info, ', ') : (is_string($img->info) ? $img->info : '');
$w = $img->widthOriginal;
$h = $img->heightOriginal;
$x = $img->fit->x + $this->packer->getPageMarginLeft() + $this->packer->getMarginLeft() +
$this->packer->getVerticalBorderWidth() + $this->packer->getVerticalBordefOffset();
$y = $img->fit->y + $this->packer->getPageMarginTop() + $this->packer->getMarginTop();
$info_y = $y + $h + $this->packer->getImageInfoMargin();
// Create main and complement images
$image_main = imagecreatefrompng($src);
$image_outline = imagecreatefrompng($src_outline);
$image_invert = imagecreatefrompng($src_invert);
$image_black = imagecreatefrompng($src_black);
list($w_px_original, $h_px_original) = getimagesize($src);
$image_main_resampled = Image::imageCreateTrueColorTransparent($w, $h);
$image_outline_resampled = Image::imageCreateTrueColorTransparent($w, $h);
$image_invert_resampled = Image::imageCreateTrueColorTransparent($w, $h);
$image_black_resampled = Image::imageCreateTrueColorTransparent($w, $h);
// Resample images from original dimension to DPI-based dimension
imagecopyresampled($image_main_resampled, $image_main, 0, 0, 0, 0, $w, $h, $w_px_original, $h_px_original);
imagecopyresampled($image_outline_resampled, $image_outline, 0, 0, 0, 0, $w, $h, $w_px_original, $h_px_original);
imagecopyresampled($image_invert_resampled, $image_invert, 0, 0, 0, 0, $w, $h, $w_px_original, $h_px_original);
imagecopyresampled($image_black_resampled, $image_black, 0, 0, 0, 0, $w, $h, $w_px_original, $h_px_original);
// Add image to all containers
// Parameters are: Destination image, source image, destination starting coordinates (x, y),
// source starting coordinates (x, y), source dimension (width, height).
imagecopy($container_main, $image_main_resampled, $x, $y, 0, 0, $w, $h);
imagecopy($container_outline, $image_outline_resampled, $x, $y, 0, 0, $w, $h);
imagecopy($container_invert, $image_invert_resampled, $x, $y, 0, 0, $w, $h);
imagecopy($container_black, $image_black_resampled, $x, $y, 0, 0, $w, $h);
// Add info to main and outline images
$info = Image::imageDrawTextBordered($w, $info_h, INFO_FONT_SIZE, INFO_BORDER_SIZE, $info_text);
imagecopy($container_main, $info, $x, $info_y, 0, 0, $w, $info_h);
imagecopy($container_outline, $info, $x, $info_y, 0, 0, $w, $info_h);
И Image::imageCreateTrueColorTransparent()
это:
/**
* Creates and returns image resource of a true color transparent image.
* @param $width
* @param $height
* @return resource
*/
public static function imageCreateTrueColorTransparent($width, $height) {
$im = imagecreatetruecolor($width, $height);
imagealphablending($im, false);
imagesavealpha($im, true);
$transparent = imagecolorallocatealpha($im, 0, 0, 0, 127);
imagefill($im, 0, 0, $transparent);
return $im;
}
Пример результата с моего локального компьютера (щелкните, чтобы просмотреть в исходном размере):
Пример результата с рабочего сервера (щелкните, чтобы просмотреть в исходном размере):
Я проводил некоторые исследования здесь, в Stackoverflow, и я получил эти два потока, которые сказали, что проблема была сгенерирована функцией imagecopyresampled()
. Тем не менее, я не уверен в этом, так как мое приложение безупречно работает на моей локальной машине. Это список веток обсуждения:
- проблема imagecopyresampled — черная рамка справа и снизу…
- PHP imagecopyresampled() создает границу изображения с одной стороны
Любая помощь будет оценена по достоинству, пожалуйста, уточните, если вы знаете, что вызывает это, и / или вы когда-либо сталкивались с этим. Заранее спасибо.