253, 'green' => 252, 'blue' => 1]; // Color for the main text $secondaryTextColorRGB = ['red' => 0, 'green' => 255, 'blue' => 0]; // Color for the secondary text $numberColorRGB = ['red' => 255, 'green' => 255, 'blue' => 255]; // Color for the counter number $frameColorRGB = ['red' => 255, 'green' => 238, 'blue' => 0]; // Color for the frame $drawFrame = true; // Boolean to toggle drawing a frame around the image // Ensure the counter file exists, and initialize if not if (!file_exists($counterFile)) { file_put_contents($counterFile, "0"); // Create the file with an initial value of 0 if it doesn't exist } // Open the file for reading and writing (c+ creates the file if it does not exist) $fp = fopen($counterFile, "c+"); if (flock($fp, LOCK_EX)) { // Lock to synchronize file access // Read and increment the counter $number = (int)fread($fp, filesize($counterFile)); $number++; // Increment the counter by 1 // Prepare the file for writing the updated counter ftruncate($fp, 0); // Clear file content rewind($fp); // Reset the file pointer to the start of the file fwrite($fp, (string)$number); // Write the new counter value to the file // Release the lock on the file flock($fp, LOCK_UN); } fclose($fp); // Close the file // Load the background image and determine its type (JPEG or PNG) list($width, $height, $type) = getimagesize($backgroundImageUrl); // Get image dimensions and type switch ($type) { case IMAGETYPE_JPEG: $backgroundImage = imagecreatefromjpeg($backgroundImageUrl); // Load JPEG image break; case IMAGETYPE_PNG: $backgroundImage = imagecreatefrompng($backgroundImageUrl); // Load PNG image break; default: die("Unsupported image format: " . $backgroundImageUrl); // Exit script if image format is not supported } // Allocate colors for the text and frame on the image $frameColor = imagecolorallocate($backgroundImage, $frameColorRGB['red'], $frameColorRGB['green'], $frameColorRGB['blue']); $textColor = imagecolorallocate($backgroundImage, $textColorRGB['red'], $textColorRGB['green'], $textColorRGB['blue']); $secondaryTextColor = imagecolorallocate($backgroundImage, $secondaryTextColorRGB['red'], $secondaryTextColorRGB['green'], $secondaryTextColorRGB['blue']); $numberColor = imagecolorallocate($backgroundImage, $numberColorRGB['red'], $numberColorRGB['green'], $numberColorRGB['blue']); // Optionally draw a rectangular frame around the entire image if ($drawFrame) { imagerectangle($backgroundImage, 0, 0, $width - 1, $height - 1, $frameColor); // Draw the frame } // Add the main text, secondary text, and counter number to the image imagestring($backgroundImage, 3, $textPositionX, $textPositionY, $customText, $textColor); // Draw main text if (!empty($secondaryText)) { imagestring($backgroundImage, 3, $secondaryTextPositionX, $secondaryTextPositionY, $secondaryText, $secondaryTextColor); // Draw secondary text if provided } imagestring($backgroundImage, 3, $numberPositionX, $numberPositionY, (string)$number, $numberColor); // Draw counter number // Output the final image as a PNG file imagepng($backgroundImage, $imageFile); // Save the image to a file imagedestroy($backgroundImage); // Free up memory used by the image // Set headers for the browser to interpret the output as an image header('Content-Type: image/png'); // MIME type for PNG image header('Content-Disposition: filename="' . $imageFile . '"'); // Suggested filename for download readfile($imageFile); // Output the image file // For more information, refer to the Git repository: // https://git.cyberwa.re/revengeday/hit-counter/src/branch/main ?>