Я хотел бы поделиться методом генерации изображений-инвайтов почти без бд.

К этому изобретению меня натолкнула эта статья и моя любовь к БД.



Итак, давайте сразу к коду!

index.php — веб-морда, здесь — форма.

<?
header('Content-Type: text/html; charset=utf-8');
?>
<fieldset>
   <legend>Get key</legend>
	TEXT:
	<input type="text" id="inp" size="50" onkeyup="document.getElementById('img').src='image.php?in='+this.value">
	<br>
	<br> IMG:
	<img src="image.php?in=" id="img" onclick="window.open(this.src)" width="200" height="200">
	<br> Клікни по картинці шоб скачати її.
</fieldset>
<fieldset>
   <legend>Test key</legend>
	<form method="post" enctype="multipart/form-data" action="test.php">
		TEXT:
		<input type="text" name="KOD" value="<?php if(isset($_POST['KOD'])){echo $_POST['KOD'];} ?>" size="50">
		<br> FILE:
		<input type="hidden" name="UserID" value="<?php
			$ip = $_SERVER['REMOTE_ADDR'];
			$ua = $_SERVER['HTTP_USER_AGENT'];
			$d = getdate();

			$UserID = sha1($ip.$ua.$d["mday"].'Secret');
			$UserID = base64_encode($UserID);
			$UserID = rtrim($UserID,"=");
			echo $UserID;
?>">
		<input type="file" name="uploadfile">
		<br>
		<button type="submit">SUBMIT</button>
	</form>
</fieldset>

UserID — идентификатор, чтобы если одновременно кто будет загружать изображения — чтобы не переплутились.

image.php — генерация изображения.

<?
include('generator.php');//Подключаем генератор
header('Content-Disposition: attachment; filename="image.png"');//Чтобы изображене скачивалось сразу

header ("Content-type: image/png");//Тип изображения
imagepng(gen($_GET['in']));//Отдаем изображение
?>

test.php — тестирование изображений.

<?php
error_reporting(0);
include('generator.php');

$UserID = rtrim(base64_encode(sha1($_POST['UserID'])), '=');//Модифицируем ID чтобы было не так просто

if (copy($_FILES['uploadfile']['tmp_name'], './files/image1_'.$UserID.'.png')){//Тестируем файл
	imagepng(gen($_POST['KOD']), './files/image2_'.$UserID.'.png');
	if (file_get_contents('./files/image2_'.$UserID.'.png') == file_get_contents('./files/image1_'.$UserID.'.png')){echo 'True';}else{echo 'False';}
}else{//или выводим ошыбку.
	echo "ERROR ".$_FILES['uploadfile']['error'];
}
?>

generator.php — самое интересное — функция генератора изображений.

<?php
function gen($input, $secret='0JAg0YLRiyDQu9GO0LHQvtC30L3QsNGC0LXQu9GM0L3Ri9C5KSDQlNCw0Lkg0LzQvdC1INC40L3QstCw0LnRgiDQvdCwINGF0LDQsdGALCDQsD8p'){//Здесь секретный ключ. 
	$hesh=sha1($input.$secret).sha1($input.sha1($input.$secret).$secret).sha1($input.sha1($input.$secret).sha1($input.sha1($input.$secret).$secret).$secret); //Генерируем строку
	$numbers = $hesh;	//Тепер генерируем цыфры
	for($i=0;$i<count(['a', 'b', 'c', 'd', 'e', 'f']);$i++){
		$numbers = str_replace(['a', 'b', 'c', 'd', 'e', 'f', '0'][$i], ['2', '3', '4', '5', '6', '7', '8'][$i], $numbers);//Заменяем буквы на цыфры		
	}


	$im = imagecreatetruecolor(200, 200);//Делаем картинку
	$color = imagecolorallocate($im, $numbers[0]*28, $numbers[1]*28, $numbers[2]*28);
	imagefilledrectangle($im, 0, 0, 200, 200, $color);xn--%20-5cdzk3ajhfdhe2f7h
	
	for($i=0; $i < round((strlen($numbers)/4), 0); $i++) {

		$k = round((strlen($numbers)/10), 0);//Коефициент увеличения. Опредилил методом перебора

		$x = $numbers[$i*4]*$k;//X
		$y = $numbers[$i*4+1]*$k;//Y


		$w = 5 + $numbers[$i*4+2]*$k;//Ширина
		$h = 5 + $numbers[$i*4+3]*$k;//Высота

		$color = imagecolorallocatealpha($im, $numbers[$i*4+1]*40, $numbers[$i*4+2]*40, $numbers[$i*4+3]*40, 70);//Цвет фигуры

		imagefilledrectangle($im, $x, $y, $x+$w, $y+$h, $color);//Рисуем прямоугольник
	}
	return $im;//Отдаем картинку
	imagedestroy($im); 
}

Ну, вот и все. База данных почти не нужна. Единственное, для чего может потребоваться — для сохранения входной строки генератора. Но можно как-то обойтись и без базы). Инвайт для слова «ИНВАЙТ» и «ХАБР».



Демо: http://app.blastorq.pp.ua/ImgInvite/
GitHub: https://github.com/da411d/ImgInviteGenerator

Комментарии (0)