Генератор изображений-инвайтов

от автора

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

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



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

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

ссылка на оригинал статьи http://habrahabr.ru/post/275117/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *