Во-первых, это должно быть очень легко для любого человека со знанием php. Я пытаюсь подсчитать количество посещений и отобразить число в виде изображения, изображения имеют имя «0.png» - «9.png», оно выбирает его на основе подсчета и должно добавить его в canvas.png который представляет собой изображение размером 296x76, служащее фоном для png, где размер 56x76. счетчик работает, но изображения не отображаются
здесь список ошибок, за которым следует странный текст
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
libpng warning: iCCP: profile 'icc': 'RGB ': RGB color space not permitted on grayscale PNG
//html
<div>
<p> <center> Number of visitors:</center> </p>
<center><img alt = "Visitor counter" src = "counter.php" /></center>
</div>
//counter.php
<?php
session_start();
$counter_name = "counter.txt";
// Check if a text file exists.
//If not create one and initialize it to zero.
if (!file_exists($counter_name)) {
$f = fopen($counter_name, "w");
fwrite($f,"0");
fclose($f);
}
// Read the current value of our counter file
$f = fopen($counter_name,"r");
$counterVal = fread($f, filesize($counter_name));
fclose($f);
// Has visitor been counted in this session?
// If not, increase counter value by one
if (!isset($_SESSION['hasVisited'])){
$_SESSION['hasVisited'] = "yes";
$counterVal++;
$f = fopen($counter_name, "w");
fwrite($f, $counterVal);
fclose($f);
}
$counterVal = str_pad($counterVal, 5, "0", STR_PAD_LEFT);
$chars = preg_split('//', $counterVal);
$im = imagecreatefrompng("canvas.png");
$src1 = imagecreatefrompng ("digits/$chars[1].png");
$src2 = imagecreatefrompng ("digits/$chars[2].png");
$src3 = imagecreatefrompng ("digits/$chars[3].png");
$src4 = imagecreatefrompng ("digits/$chars[4].png");
$src5 = imagecreatefrompng ("digits/$chars[5].png");
imagecopymerge($im, $src1, 0, 0, 0, 0, 56, 76, 100);
imagecopymerge($im, $src2, 60, 0, 0, 0, 56, 76, 100);
imagecopymerge($im, $src3, 120, 0, 0, 0, 56, 76, 100);
imagecopymerge($im, $src4, 180, 0, 0, 0, 56, 76, 100);
imagecopymerge($im, $src5, 240, 0, 0, 0, 56, 76, 100);
// Output and free from memory
header('Content-Type: image/png');
echo imagepng($im);
imagedestroy($im);
?>
Предполагается, что он дает изображение счетчика и показывает его в моем index.html, но все, что я вижу, это "?" где должно быть изображение






У вас есть серьезные проблемы с эффективностью, но давайте начнем с основ.
В первую очередь эта строка: эхо-изображениеpng($im);
Убери эхо. Если вы не передадите имя файла в imagepng(), функция выведет данные изображения. Однако ваше эхо отображает значение RETURN этой функции, которая является логическим значением. Таким образом, эхо фактически добавит данные, которые искажают остальные данные изображения.
Далее, ваши предупреждения в градациях серого связаны с тем, что canvas.png является изображением в градациях серого. Вам нужно открыть его и повторно сохранить как изображение в истинном цвете, чтобы при копировании других изображений их цвета существовали в палитре canvas.png.
В-третьих, использование текстового файла для данных счетчика — плохая идея. В любой момент, если у вас есть два одновременных посетителя, вы получите неверные данные. База данных предотвратит это.
В-четвертых, использование отдельных файлов изображений для каждой цифры неэффективно. Я предполагаю, что вы используете стилизованные цифры, поэтому вы не можете просто написать текст (если у вас нет оригинального шрифта). При таком предположении вы должны располагать все цифры рядом на одном изображении, а затем копировать цифры по мере необходимости.
В качестве альтернативы, если вы хотите использовать отдельные изображения цифр, используйте PHP, чтобы просто сгенерировать HTML для отдельных тегов img рядом друг с другом. Это было бы намного эффективнее, чем генерировать новое изображение на лету с помощью GD.
В-пятых, у вас есть $counterVal, который является строкой. Вы можете получить доступ к отдельным символам в $counterVal, как в массиве:
$counterVal[0] - это первый символ/цифра и т. д. Вам вообще не нужна preg_split().
Наконец, я всегда рекомендую людям вообще не использовать счетчики посещений. Нет никакой выгоды. Это никогда не бывает точным, и если число низкое, то вы только показываете остальному миру, что страница не популярна. Если число велико, то другим посетителям все равно на самом деле все равно, и вы только что потратили много ресурсов своего веб-сервера на тысячи или миллионы дополнительных выполнений PHP для генерации этих данных.
Если вас интересует трафик на страницу, наиболее точным механизмом является анализ журналов вашего веб-сервера. Он расскажет вам о количестве посещений на странице и НАМНОГО больше.
echo imagepng не нужен, так как функция изображениеpng по умолчанию отправляет вывод в браузер. См. документацию для изображениеpng.
Насколько я понимаю, вам нужно $counterVal для хранения 5 цифр. Функция str_pad не создаст строку с фиксированным количеством символов. Он просто добавляет заданное количество символов слева или справа от входной строки. См. документацию для str_pad. Чтобы гарантировать, что $counterVal имеет 5 цифр, можно использовать следующий код:
$len = strlen($counterVal);
$zero_count = (5 - $len);
$zero_padding = str_repeat("0", $zero_count);
$counterVal = $zero_padding . $counterVal;
Сообщение об ошибке, которое вы опубликовали, предполагает, что изображение холст.png представляет собой изображение в градациях серого, но цифровые изображения имеют формат RGB.
В изображениях в градациях серого каждый пиксель имеет значение от 0 до 255. В изображениях RGB каждый пиксель имеет значение из трех кортежей, определяемое как (r, g, b), где r, g и b имеют значения от 0 до 255.
Вы можете попробовать использовать imagecopymergegray, который преобразует пиксели RGB в оттенки серого перед копированием из источника в место назначения. Если это не сработает, вы можете использовать редактор изображений, чтобы преобразовать изображение холста и цифровое изображение в один и тот же формат. Например, оба могут быть преобразованы в оттенки серого или RGB.
Как упоминалось в ответе @jhilgeman, неэффективно создавать новое изображение счетчика посетителей с использованием GD для каждого посещения. Было бы намного лучше просто выводить теги изображений для цифр.
Сделайте это проще, я надеюсь, что этот ответ поможет вам, повторите текстовый файл с количеством зрителей и добавьте к нему фоновое изображение.
<div>
<p> <center> Number of visitors:</center> </p>
<center> <div style = " position: relative;
width: 24px;
background-image: url(https://image.freepik.com/free-vector/elegant-white-background-with-shiny-lines_1017-17580.jpg);
padding: 50px"><?php echo file_get_contents("counter.txt"); ?></div>
</center>
</div>