<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Paradigm.ru &#187; графика</title>
	<atom:link href="http://paradigm.ru/tag/%d0%b3%d1%80%d0%b0%d1%84%d0%b8%d0%ba%d0%b0/feed" rel="self" type="application/rss+xml" />
	<link>http://paradigm.ru</link>
	<description>Блог Александра Мусаева</description>
	<lastBuildDate>Sat, 08 May 2010 16:13:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Как сделать «бесконечное» фоновое&#160;изображение?</title>
		<link>http://paradigm.ru/2007/12/the-neverending-background-image-story</link>
		<comments>http://paradigm.ru/2007/12/the-neverending-background-image-story#comments</comments>
		<pubDate>Thu, 20 Dec 2007 23:29:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Веб-дизайн]]></category>
		<category><![CDATA[photoshop]]></category>
		<category><![CDATA[веб-дизайн]]></category>
		<category><![CDATA[графика]]></category>

		<guid isPermaLink="false">http://www.paradigm.ru/2007/12/21/the-neverending-background-image-story/</guid>
		<description><![CDATA[Сейчас сложно кого-то удивить использованием фоновых графических изображений на&#160;веб-страницах, тем не&#160;менее, в&#160;этом нехитром приеме оформления есть свои тонкости. В&#160;частности, при использовании графики (т.е. растровых изображений с&#160;жестко-определенными размерами), всегда нужно уделять особое внимание тому, как страница поведет себя при масштабировании. Далеко не&#160;все браузеры умеют масштабировать фон, тем не&#160;менее он&#160;должен сохранять пристойный вид даже при существенном изменении [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас сложно кого-то удивить использованием фоновых графических изображений на&nbsp;веб-страницах, тем не&nbsp;менее, в&nbsp;этом нехитром приеме оформления есть свои тонкости. В&nbsp;частности, при использовании графики (т.е. растровых изображений с&nbsp;жестко-определенными размерами), всегда нужно уделять особое внимание тому, как страница поведет себя при масштабировании. Далеко не&nbsp;все браузеры умеют масштабировать фон, тем не&nbsp;менее он&nbsp;должен сохранять пристойный вид даже при существенном изменении размеров текстовых блоков и&nbsp;других элементов страницы.</p>
<p>Самый беспроблемный способ реализации графического фона состоит в&nbsp;использовании повторяющейся текстуры (&laquo;мозаики&raquo;), которая автоматически заполнит окно любого размера. Другой несложный вариант&nbsp;&#8212; привязка графики к&nbsp;границе окна браузера (так, например, обычно делают модный фоновый градиент) или к&nbsp;одному из&nbsp;ее&nbsp;углов (часто используется для позиционирования больших визуальных элементов). Такие текстуры так&nbsp;же не&nbsp;&laquo;сломаются&raquo; при изменении масштаба.</p>
<p>Описанные методы подходят в&nbsp;тех случаях, когда само фоновое изображение не&nbsp;содержит в&nbsp;себе сложных деталей и&nbsp;&laquo;границ кадра&raquo;, обрезающих объекты на&nbsp;картинке. Существует способ сделать &laquo;бесконечный&raquo; фон на&nbsp;основе фотографии, описание которого я&nbsp;нашел на&nbsp;сайте <a href="http://24ways.org" rel="nofollow">24ways.org</a>, и&nbsp;привожу здесь перевод со&nbsp;своими комментариями. <span id="more-101"></span></p>
<p style="margin-top:2em;margin-bottom:2em;">
<strong>Автор:</strong> Эллиот Джей Стокс, <a href="http://elliotjaystocks.com">elliotjaystocks.com</a><br />
<strong>Оригинал:</strong> <a href="http://24ways.org/2007/the-neverending-background-image-story" rel="nofollow">http://24ways.org/2007/the-neverending-background-image-story</a><br />
<strong>Перевод:</strong> Александр Мусаев, <a href="http://paradigm.ru">paradigm.ru</a>
</p>
<p>В&nbsp;статье рассмотрен метод превращения фотографии в&nbsp;фон для веб-страницы, который сможет заполнить окно браузера любой ширины. Мы&nbsp;не&nbsp;будем останавливаться на&nbsp;деталях обработки конкретной фотографии, а&nbsp;дадим описание обобщенной последовательности шагов. Для иллюстрации используется фотографии пляжа Майами-Бич, подготовленная для сайта <a href="http://futureofwebapps.com" rel="nofollow">futureofwebapps.com</a>.</p>
<p><em>Примечание:</em> уровень изложения материала предполагает, что читатель обладает базовыми навыками работы в&nbsp;Photoshop и&nbsp;умеет пользоваться кистями, градиентами и&nbsp;другими основными средствами.</p>
<h3>1.&nbsp;Выбор исходного изображения</h3>
<p>Можно выделить три критерия оценки пригодности фотографии для создания бесконечного фона:</p>
<ul>
<li>простота изображения (чем сложнее текстура&nbsp;&#8212; тем сложнее будет с&nbsp;ней работать);</li>
<li>подходящий угол обзора (стоит обратить внимание на&nbsp;положение теней и&nbsp;общую перспективу фотографии, чтобы в&nbsp;процессе обработки не&nbsp;получилось изломов линии горизонта и&nbsp;других дефектов);</li>
<li>протяженность (для обеспечения легкости клонирования элементов изображения).</li>
</ul>
<p>Ниже&nbsp;&#8212; исходная версия фотографии, приобретенной на&nbsp;<a href="http://istockphoto.com" rel="nofollow">iStockPhoto</a>, а&nbsp;<a href="http://media.24ways.org/2007/03/step01-diagram.jpg" rel="nofollow">здесь</a>&nbsp;&#8212; ее&nbsp;увеличенная копия с&nbsp;комментарии отдельных деталей, объясняющих сделанный выбор.</p>
<p><img src="http://paradigm.ru/;-)/2007/12/01.jpg" width="400" height="200" alt="" /></p>
<p>Та&nbsp;же фотография со&nbsp;&laquo;сглаженными&raquo;, в&nbsp;ходе предварительной обработки Фотошопом, углами.</p>
<p><img src="http://a.paradigm.ru/2007/12/02.jpg" width="400" height="200" alt="" /></p>
<h3>2.&nbsp;Горизонтальные линии</h3>
<p>После предварительной обработки, следует выделить блок пикселей с&nbsp;одной из&nbsp;боковых границ изображения, на&nbsp;базе которых будет сделана горизонтальная текстура. какой именно стороне отдать предпочтение, принципиальной разницы нет, но&nbsp;имеет смысл выбрать ту,&nbsp;которая содержит более узкий цветовой диапазон и&nbsp;наиболее простую текстуру.</p>
<p>В&nbsp;Фотошопе есть очень удобный для этой цели инструмент&nbsp;&#8212; Single column marquee tool. Выделяем им&nbsp;&laquo;пограничные&raquo; пиксели (в&nbsp;нашем примере&nbsp;&#8212; с&nbsp;правой стороны фотографии), затем копируем их&nbsp;в&nbsp;новый слой и,&nbsp;с&nbsp;помощью инструмента Free transform (Ctrl-T/Cmd-T), растягиваем полученный фрагмент в&nbsp;ширину, заполняя им&nbsp;всю рабочую область.</p>
<p><img src="http://b.paradigm.ru/2007/12/031.jpg" width="400" height="186" alt="" /></p>
<h3>3.&nbsp;Клонирование</h3>
<p>Далее нам может может существенно пригодиться старый-добрый Clone tool. Применять его всегда стоит с&nbsp;осторожностью: копию исходного изображения лучше делать на&nbsp;новом слое, чтобы получить возможность двигать или корректировать ее&nbsp;иным способом, не&nbsp;изменяя оригинал.</p>
<p>Ниже показано, как была дорисована тень от&nbsp;пальмы, обрезанная границей кадра.</p>
<p><img src="http://a.paradigm.ru/2007/12/041.jpg" width="400" height="247" alt="" /></p>
<p><img src="http://b.paradigm.ru/2007/12/051.jpg" width="400" height="247" alt="" /></p>
<p>Основная часть тени осталась &laquo;натуральной&raquo;, а&nbsp;клонированный фрагмент был дополнительно трансформирован и&nbsp;размыт градиентом, благодаря чему в&nbsp;глаза не&nbsp;бросается то,&nbsp;что это копия.</p>
<h3>4.&nbsp;Сглаживание границ</h3>
<p>Основная задача на&nbsp;этом этапе состоит в&nbsp;том, чтобы добиться плавного перетекания боковых границ фотографии в&nbsp;горизонтальную текстуру. Для этого создадим специальный слой с&nbsp;обработанной копией фрагмента исходной фотографии, который частично скроет под собой периферийные детали, мешающие этому перетеканию. Градиентами можно размыть границы нового слоя, а&nbsp;с&nbsp;помощью &laquo;мягких&raquo; кистей&nbsp;&#8212; скрыть лишние артефакты.</p>
<p>На&nbsp;следующей иллюстрации показаны два слоя: самый &laquo;нижний&raquo; слой, который был сделан на&nbsp;первом шаге, и&nbsp;фронтальный, расположенный в&nbsp;правой части изображения. Основной слой с&nbsp;фотографией будет находиться между ними (в&nbsp;данном случае он&nbsp;скрыт).</p>
<p><img src="http://a.paradigm.ru/2007/12/061.jpg" width="400" height="379" alt="" /></p>
<p>Периферийный слой плавно сливается с&nbsp;основным изображением и&nbsp;скрывает нежелательные тени на&nbsp;песке.</p>
<p><img src="http://b.paradigm.ru/2007/12/071.jpg" width="400" height="379" alt="" /></p>
<p>Для того, чтобы добиться идентичности между левой и&nbsp;правой границами, можно скопировать полученный слой, отразить его по&nbsp;горизонтали и&nbsp;использовать как основу при обработке левой части изображения.</p>
<h3>5.&nbsp;Сшивание текстуры</h3>
<p>Вне зависимости от&nbsp;того, каким способом были сглажены границы, линии стыка скорее всего окажутся заметными из-за неестественного отсутствия в&nbsp;их&nbsp;районе каких-либо деталей. Добавлением таких деталей можно скрыть недостаток.</p>
<p>В&nbsp;нашем примере это могут быть облака.</p>
<p><img src="http://a.paradigm.ru/2007/12/08.jpg" width="400" height="186" alt="" /></p>
<p>Используем мягкие кисти и&nbsp;отдельный слой для рисования.</p>
<p><img src="http://b.paradigm.ru/2007/12/09.jpg" width="400" height="186" alt="" /></p>
<p>Снижаем прозрачность &laquo;облака&raquo; до&nbsp;20%, после чего, с&nbsp;помощью Free transform tool, отодвигаем его за&nbsp;правую границу кадра так, чтобы центр слоя совпал с&nbsp;ней.</p>
<p><img src="http://a.paradigm.ru/2007/12/10.jpg" width="400" height="186" alt="" /></p>
<p>Делаем копию этого слоя и&nbsp;аналогичным образом позиционируем ее&nbsp;в&nbsp;левой части фотографии, благодаря чему добиваемся плавного перетекания изображения через границу текстуры.</p>
<p><img src="http://b.paradigm.ru/2007/12/11.jpg" width="400" height="186" alt="" /></p>
<p><em>Прим. переводчика:</em> в&nbsp;приведенном примере можно было&nbsp;бы вообще обойтись без &laquo;размножения&raquo; пальм, ограничившись уходящей за&nbsp;границы окна линией побережья. В&nbsp;противном случае, на&nbsp;больших мониторах остается заметно, что детали изображения на&nbsp;переднем плане клонированы (см.&nbsp;тень от&nbsp;крайней левой пальмы).</p>
<p><img src="http://a.paradigm.ru/2007/12/12-fowa.jpg" width="550" height="374" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://paradigm.ru/2007/12/the-neverending-background-image-story/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Приручаем Google Chart API</title>
		<link>http://paradigm.ru/2007/12/google-chart</link>
		<comments>http://paradigm.ru/2007/12/google-chart#comments</comments>
		<pubDate>Mon, 17 Dec 2007 22:12:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Веб-разработка]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[графика]]></category>
		<category><![CDATA[диаграммы]]></category>
		<category><![CDATA[инфографика]]></category>
		<category><![CDATA[сервисы]]></category>

		<guid isPermaLink="false">http://www.paradigm.ru/2007/12/18/%d0%bf%d1%80%d0%b8%d1%80%d1%83%d1%87%d0%b0%d0%b5%d0%bc-google-chart-api/</guid>
		<description><![CDATA[В&#160;начале этого месяца, большой брат открыл новый интересный сервис для генерации красивых диаграмм&#160;&#8212; Google Chart. Эти графики по&#160;своему оформлению и&#160;функциональности очень близки к&#160;тому, что мы&#160;уже видели в&#160;Spreadsheets, но&#160;теперь появилась возможность генерировать их&#160;автономно. Программный интерфейс у&#160;сервиса достаточно прост: все параметры отрисовки диаграммы и&#160;данные для визуализации передаются на&#160;сервер Google в&#160;виде GET запроса (проще говоря, специального URL), а&#160;сервер [...]]]></description>
			<content:encoded><![CDATA[<p>В&nbsp;начале этого месяца, <a href="http://google.com">большой брат</a> открыл новый интересный сервис для генерации красивых диаграмм&nbsp;&#8212; Google Chart. Эти графики по&nbsp;своему оформлению и&nbsp;функциональности очень близки к&nbsp;тому, что мы&nbsp;уже видели в&nbsp;<a href="http://docs.google.com/">Spreadsheets</a>, но&nbsp;теперь появилась возможность генерировать их&nbsp;автономно.</p>
<p><img src='http://paradigm.ru/;-)/2007/12/chart.png' alt='chart.png' /></p>
<p>Программный интерфейс у&nbsp;сервиса достаточно прост: все параметры отрисовки диаграммы и&nbsp;данные для визуализации передаются на&nbsp;сервер Google в&nbsp;виде GET запроса (проще говоря, специального URL), а&nbsp;сервер в&nbsp;ответ отдает PNG с&nbsp;нарисованным графиком. По&nbsp;скорости процесс сравним с&nbsp;загрузкой статических файлов, кроме того правила его использования не&nbsp;накладывают никаких жестких ограничений на&nbsp;количество обращений с&nbsp;одного хоста. Все это позволяет очень легко интегрировать Chart в&nbsp;свои системы, да&nbsp;еще и&nbsp;бесплатно снять с&nbsp;собственного сервера дополнительную нагрузку по&nbsp;генерации графики. <span id="more-88"></span></p>
<p>Гибкость возможностей Chart API послужила причиной разростания количества параметров URL. Ниже будут приведены несколько примеров того, как с&nbsp;помощью серверных скриптов облегчить задачу по&nbsp;формированию запросов к&nbsp;сервису.</p>
<h3>Упаковка данных</h3>
<p>В&nbsp;Chart API предлагается три варианта представления данных, на&nbsp;основе которых будут строиться диаграммы. Самый простой из&nbsp;них&nbsp;&#8212; перечисление значений через запятую. Но&nbsp;для большей компактности URL, так&nbsp;же можно кодировать числа одним из&nbsp;двух способов, в&nbsp;результате чего объем передаваемых данных сократится.</p>
<p>Самым эффективным способом кодирования, который мы&nbsp;и&nbsp;будем использовать, является т.н. &laquo;<a href="http://code.google.com/apis/chart/#extended">extended encoding</a>&raquo;. Метод сводится к&nbsp;последовательной записи двузначных чисел в&nbsp;шестидесятичетырехразрядной (прости меня, русский язык) системе счисления. Динамический диапазон таких значений находится в&nbsp;интервале от&nbsp;0&nbsp;до&nbsp;4095 (64&sup2;&nbsp;&#8212; 1). Для их&nbsp;представления в&nbsp;кодированном виде, согласно предписанию документации, необходимо использовать строчные и&nbsp;прописные английские буквы, цифровые символы, а&nbsp;так&nbsp;же тире и&nbsp;точку (всего набирается как раз 64&nbsp;символа). В&nbsp;том случае, если значение не&nbsp;задано, оно будет обозначаться последовательностью из&nbsp;двух &laquo;_&raquo;.</p>
<p>Следующая функция, написанная на&nbsp;PHP, выполняет преобразование десятичных чисел в&nbsp;extended encoding для Google Chart:</p>
<pre><code class="php">function google_ext_encode($dec) {
	if($dec === false) return '__';

	$e = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
		'abcdefghijklmnopqrstuvwxyz0123456789-.';
	$m = strlen($e); // == 63
	$res = '';

	do {
		$r = $dec % $m;
		$dec = (int)($dec / $m);
		$res = $e[$r].$res;
	} while($dec > 0);

	$res = sprintf("%'A2s", $res);
	return $res;
}</code></pre>
<p>Тест:</p>
<pre><code lang="php">
$test = array(0, 25, 26, 51, 4093, 4094, 4095);
echo '&lt;pre&gt;';
printr_r(array_map("google_ext_encode", $test));
echo '&lt;/pre&gt;';
</code></pre>
<p>Программа выдаст несколько закодированных чисел, с&nbsp;аналогичными приведенным в&nbsp;документации значениями: <code>AA</code>, <code>AZ</code>, <code>Aa</code>, <code>Az</code>, <code>.9</code>, <code>.-</code>, <code>..</code>.</p>
<h3>Поддержка русского языка</h3>
<p>Еще до&nbsp;начала первых экспериментов с&nbsp;Google Chart, у&nbsp;меня было подозрение на&nbsp;тему того, что в&nbsp;нем может не&nbsp;оказаться поддержки русского алфавита (и&nbsp;вообще любых языков кроме английского). Как выяснилось, подозрения были напрасны: API прекрасно поддерживает UTF-8.</p>
<p>HTML код для вставки графика в&nbsp;веб страницу удобно генерировать с&nbsp;помощью специальной функции, пример реализации которой приведен далее. Внутри нее выполняется корректное преобразование текста для надписей:</p>
<pre><code lang="php">function chart_html($type, $width,
	$height, $data, $labels = false, $colors = false, $alt = '') {

	$edata = implode('', (array_map("google_ext_encode", $data)));
	$url = 'http://chart.apis.google.com/chart?cht='.$type.
		'&amp;chd=e:'.$edata.'&amp;chs='.$width.'x'.$height;

	if(is_array($colors) &amp;&amp; count($colors))
		$url .= '&amp;chco='.implode(',', $colors);

	if(is_array($labels) &amp;&amp; count($labels))
		$url .= '&amp;chl='.implode('|', (array_map("urlencode", $labels)));

	return '&lt;img src="'.$url.'" width="'.$width.'" height="'.$height.
		'" alt="'.$alt.'" /&gt;';
}</code></pre>
<p>Стоит обратить внимание на&nbsp;две детали:</p>
<ol>
<li>Функция не&nbsp;задействует все параметры, доступные в&nbsp;Charts API, а&nbsp;работает только с&nbsp;наиболее актуальными. Она была написана для генерации круговых диаграмм под конкретную задачу. Для иных типов графиков логичным шагом будет корректировка набора аргументов.</li>
<li>Файл с&nbsp;кодом сохранен в&nbsp;кодировке UTF-8. При хранении исходников и&nbsp;данных в&nbsp;8-битной кодировке, понадобится дополнительное преобразование текста в&nbsp;UTF, чтобы не-английские буквы не&nbsp;отображались на&nbsp;диаграммах как вопросительные знаки.</li>
</ol>
<p>Функция <code>chart_html()</code> будет выдавать XHTML теги <code>img</code>, в&nbsp;соответствии с&nbsp;заданными параметрами:</p>
<ul>
<li><code>$type</code>&nbsp;&#8212; условное обозначение типа диаграммы. Используемое в&nbsp;тестах значение <code>p3</code>, например, соответствует трехмерной круговой диаграмме. Описание других вариантов можно найти в&nbsp;<a href="http://code.google.com/apis/chart/#chart_type">официальной документации API</a>.</li>
<li><code>$width</code>, <code>$height</code>&nbsp;&#8212; соответственно, ширина и&nbsp;высота генерируемого графического изображения в&nbsp;пикселях. Максимальное значение для каждой величины&nbsp;&#8212; 1000. При выборе размера, следует помнить о&nbsp;необходимости свободного пространства вокруг графика, т.к. при его недостатке надписи могут быть обрезаны границей картинки. Оптимальную величину для выбранного сочетания размера и&nbsp;типа диаграммы, проще всего подбирать методом &laquo;научного тыка&raquo;.</li>
<li><code>$data</code>&nbsp;&#8212; массив с&nbsp;данными для визуализации на&nbsp;диаграмме.</li>
<li><code>$labels</code>&nbsp;&#8212; (необязательный параметр) массив с&nbsp;надписями для отображения на&nbsp;графике.</li>
<li><code>$colors</code>&nbsp;&#8212; (необязательный параметр) массив со&nbsp;значениями цветов, которые будут использованы для отрисовки элементов изображения (например, секторов круговой диаграммы). Если количество цветов в&nbsp;массиве будет меньше количества элементов, дополнительные, схожие по&nbsp;тональности цвета будут добавлены автоматически.</li>
<li><code>$alt</code>&nbsp;&#8212; (необязательный параметр) значение атрибута <code>alt</code> тега <code>img</code>. Если этот аргумент не&nbsp;задать, атрибуту <code>alt</code> будет задано пустое значение.</li>
</ul>
<p>Тест:</p>
<pre><code lang="php">$width = 300;
$height = 100;
$data = array(100, 128, 200, 38);
$labels = array('Одно', 'Другое', 'Третье', 'Четвертое');

echo chart_html('p3', 500, 150, $data, $labels, false,
	'Google Chart Test').'&lt;br /&gt;';

shuffle($data);

// задано значение альфа-канала
$colors = array('33dd66cc');
echo chart_html('p3', 500, 150, $data, $labels, $colors,
	'Демография Хабрахабра').'&lt;br /&gt;';</code></pre>
<p>Функция <code>chart_html()</code> будет генерировать ссылки примерно такого вида:</p>
<p><code>http://chart.apis.google.com/chart? cht=p3 &amp;chd=e:BkCADIAm &amp;chs=500x150 &amp;chl=%D0%9E%D0%B4%D0%BD%D0%BE |%D0%94%D1%80%D1%83%D0%B3%D0%BE%D0%B5 |%D0%A2%D1%80%D0%B5%D1%82%D1%8C%D0%B5 |%D0%A7%D0%B5%D1%82%D0%B2%D0<br />
%B5%D1%80%D1%82%D0%BE%D0%B5</code></p>
<p>В&nbsp;результате получаем две диаграммы:</p>
<p><img src="http://paradigm.ru/;-)/2007/12/chart1.png" width="500" height="150" alt="Google Chart Test" /></p>
<p>Демография Хабрахабра:</p>
<p><img src="http://paradigm.ru/;-)/2007/12/chart2.png" width="500" height="150" alt="Демография Хабрахабра" /></p>
<p>(благодаря заданному значению альфа-канала, диаграмма получилась полупрозрачной)</p>
]]></content:encoded>
			<wfw:commentRss>http://paradigm.ru/2007/12/google-chart/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->