2024-07-06 16:13:13 +00:00
|
|
|
<?php
|
2024-11-03 13:11:44 +00:00
|
|
|
// Define paths and filenames for the counter file and generated image output
|
2024-07-06 16:13:13 +00:00
|
|
|
$counterFile = "example.txt";
|
|
|
|
$imageFile = "example.png";
|
|
|
|
|
2024-11-03 13:11:44 +00:00
|
|
|
// Background image URL for the counter display
|
2024-07-06 16:13:13 +00:00
|
|
|
$backgroundImageUrl = "https://datakra.sh/assets/example_counter.jpg"; // Replace this with your actual background image URL
|
|
|
|
|
|
|
|
// Text settings to be displayed on the image
|
|
|
|
$customText = "Hit Counter!"; // Main headline text
|
|
|
|
$secondaryText = "Super cyber, super cool!"; // Secondary descriptive text
|
|
|
|
|
|
|
|
// Coordinates for positioning the text and number on the image
|
|
|
|
$textPositionX = 5; // X-coordinate for the main text
|
|
|
|
$textPositionY = 5; // Y-coordinate for the main text
|
|
|
|
$secondaryTextPositionX = 5; // X-coordinate for the secondary text
|
|
|
|
$secondaryTextPositionY = 15; // Y-coordinate for the secondary text
|
|
|
|
$numberPositionX = 5; // X-coordinate for the counter number
|
|
|
|
$numberPositionY = 25; // Y-coordinate for the counter number
|
|
|
|
|
|
|
|
// RGB color definitions for text, secondary text, number, and optional frame
|
|
|
|
$textColorRGB = ['red' => 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
|
|
|
|
|
2024-11-03 13:11:44 +00:00
|
|
|
// Ensure the counter file exists, and initialize if not
|
2024-07-06 16:13:13 +00:00
|
|
|
if (!file_exists($counterFile)) {
|
2024-11-03 13:11:44 +00:00
|
|
|
file_put_contents($counterFile, "0"); // Create the file with an initial value of 0 if it doesn't exist
|
2024-07-06 16:13:13 +00:00
|
|
|
}
|
2024-11-03 13:11:44 +00:00
|
|
|
|
|
|
|
// 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
|
2024-07-06 16:13:13 +00:00
|
|
|
|
|
|
|
// 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:
|
2024-11-03 13:11:44 +00:00
|
|
|
die("Unsupported image format: " . $backgroundImageUrl); // Exit script if image format is not supported
|
2024-07-06 16:13:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
2024-11-03 13:11:44 +00:00
|
|
|
// Set headers for the browser to interpret the output as an image
|
2024-07-06 16:13:13 +00:00
|
|
|
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
|
|
|
|
?>
|