<?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>Code42 &#187; obrazki</title>
	<atom:link href="http://code42.pl/tag/obrazki/feed/" rel="self" type="application/rss+xml" />
	<link>http://code42.pl</link>
	<description>Wielkie Pytanie o Życie, Kod i całą resztę</description>
	<lastBuildDate>Wed, 25 Jan 2012 14:16:01 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Jak przycinać i skalować obrazki?</title>
		<link>http://code42.pl/2009/04/17/jak-przycinac-i-skalowac-obrazki/</link>
		<comments>http://code42.pl/2009/04/17/jak-przycinac-i-skalowac-obrazki/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 17:37:59 +0000</pubDate>
		<dc:creator>eshaem</dc:creator>
				<category><![CDATA[Różne]]></category>
		<category><![CDATA[algorytmy]]></category>
		<category><![CDATA[obrazki]]></category>

		<guid isPermaLink="false">http://code42.pl/?p=326</guid>
		<description><![CDATA[Odwiecznym problemem przy wyświetlaniu obrazków użytkowników jest przycinanie i skalowanie ich w taki sposób, który pasuje do wyglądu serwisu. Problem na pierwszy rzut oka może wydawać się dość trudny ze względu na różnorodność obrazków, które może wysłać użytkownik, posiada on jednak proste i eleganckie rozwiązanie. Na potrzeby wypisu założmy, że zajmujemy się przeskalowaniem powyższego obrazka [...]


Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/' rel='bookmark' title='Refaktoryzacja CSS — jednak coś można'>Refaktoryzacja CSS — jednak coś można</a></li>
<li><a href='http://code42.pl/2010/04/04/dwukolumnowa-lista-definicji-edit-w-html5-lista-opisow/' rel='bookmark' title='Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))'>Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Odwiecznym problemem przy wyświetlaniu obrazków użytkowników jest przycinanie i skalowanie ich w taki sposób, który pasuje do wyglądu serwisu. Problem na pierwszy rzut oka może wydawać się dość trudny ze względu na różnorodność obrazków, które może wysłać użytkownik, posiada on jednak proste i eleganckie rozwiązanie.</p>
<div id="attachment_327" class="wp-caption aligncenter" style="width: 310px"><img class="size-full wp-image-327" title="Lena" src="http://code42.pl/wp-content/uploads/2009/04/lena.jpg" alt="lena" width="300" height="300" /><p class="wp-caption-text">Lena - obiekt naszych testów</p></div>
<p style="text-align: left;">Na potrzeby wypisu założmy, że zajmujemy się przeskalowaniem powyższego obrazka z rozmiarów <em>300 x 300 px</em> na <em>200 x 100</em> <em>px</em>. Można pomyśleć o najprostszym rozwiązaniu, czyli przeskalowaniu albo wycięciu odpowiedniego kawłka z oryginalnego obrazka. Żadne z tych rozwiązań nie jest jednak dobre, pierwsze nie poradzi sobie z plikami, w których stosunek szerokości do długości jest inny niż docelowy, drugą metodą wytniemy jedynie fragment z obrazka pomijając być może istotną część interesującą użytkowników naszego serwisu. (W szczególności problem pojawia się problem przy dużych obrazkach, którą część wycinać? Przedstawiony poniżej przykład jest nieco tendecyncyjny ze względu na małą wielkość obrazka.)</p>
<div id="attachment_328" class="wp-caption aligncenter" style="width: 210px"><img class="size-full wp-image-328" title="lena-zle-1" src="http://code42.pl/wp-content/uploads/2009/04/lena-zle-1.jpg" alt="Skalowanie" width="200" height="100" /><p class="wp-caption-text">Skalowanie</p></div>
<div id="attachment_329" class="wp-caption aligncenter" style="width: 210px"><img class="size-full wp-image-329" title="lena-zle-2" src="http://code42.pl/wp-content/uploads/2009/04/lena-zle-2.jpg" alt="Wycinanie" width="200" height="100" /><p class="wp-caption-text">Wycinanie</p></div>
<p>Potrzebujemy więc rozwiązanie, które pozwoli uwzględnić różny stosunek wysokości do szerokości obrazka dostarczonego przez użytkownika, oraz umożliwi pokazanie jego jak największej zawartości. Najlepiej więc będzie jeżeli będziemy tylko ścinać obraz z góry i dołu, lub lewej i prawej a następnie skalować go do żądanego rozmiaru. Niech <strong>i<sub>w</sub></strong> i <strong>i<sub>h</sub></strong> oznaczają odpowiednio szerokość i wysokość obrazka wejściowego, natomiast <strong>o<sub>w</sub></strong> i <strong>o<sub>h</sub></strong> analogicznie dla obrazka wyjściowego. Obliczamy stosunki szerokości do wysokości dla obrazków:</p>
<ul>
<li><strong>R<sub>i</sub></strong> = i<sub>w</sub>/i<sub>h</sub> &#8211; w naszym przypadku wynosi on 300/300 = 1</li>
<li><strong>R<sub>o</sub> </strong>= o<sub>w</sub>/o<sub>h</sub> &#8211; w naszym przypadku wynosi on 200/100 = 2</li>
</ul>
<p>Ponieważ <strong>R<sub>o</sub></strong> jest większy niż <strong>R<sub>i</sub></strong>, czyli w obrazku wyjściowym przypada więcej pikseli szerokości na piksel wysokości, to powinniśmy wyciąć możliwe najmniejszy kawałek góry i dołu z oryginalnego obrazka tak aby uzyskać w nim współczynnik <strong>R<sub>o</sub></strong>. Wymiary pasów, które powinniśmy wyciąć obliczamy następująco:</p>
<ul>
<li>d<sub>h</sub> = i<sub>w</sub>/r<sub>o</sub> &#8211; w naszym przypadku 300/2 = 150</li>
</ul>
<p>Ponieważ sumaryczna szerokość pasa wynosi 150, to przytniemy z góry i dołu pasy o szerokości 300 i wysokości 75 i skalujemy to co zostało do rozmiaru <em>200 x 100 px</em>, przyjmując optymistycznie, że na skraju obrazka znajdują się zawsze najmniej istotne treści.</p>
<div id="attachment_338" class="wp-caption aligncenter" style="width: 310px"><img class="size-full wp-image-338" title="lena-dobrze-1" src="http://code42.pl/wp-content/uploads/2009/04/lena-dobrze-1.jpg" alt="Fragment obrazka do przeskalowania" width="300" height="300" /><p class="wp-caption-text">Fragment obrazka do przeskalowania</p></div>
<div id="attachment_341" class="wp-caption aligncenter" style="width: 210px"><img class="size-full wp-image-341" title="lena-dobrze-2" src="http://code42.pl/wp-content/uploads/2009/04/lena-dobrze-2.jpg" alt="Wynik działania metody" width="200" height="100" /><p class="wp-caption-text">Wynik działania metody</p></div>
<p>Sytuacja gdy <strong>R<sub>o</sub></strong> jest mniejsze od <strong>R<sub>i</sub></strong> jest analogiczna, nie będę więc jej omawiał. Przedstawiony algorytm jest bardzo prosty i w pseudokodzie wygląda następująco:</p>
<pre>R<sub>i</sub> = i<sub>w</sub> / i<sub>h</sub>
R<sub>o</sub> = o<sub>w</sub> / o<sub>h</sub>

if (R<sub>i</sub>  &lt;= R<sub>o</sub>)
{
  new_h = i<sub>w</sub> / R<sub>o</sub>
  segment = (i<sub>h</sub>-new<sub>h</sub>)/2
  zetnij pas o wysokości <em>segment</em> z góry i dołu
  i przeskaluj do rozmiarów <em>o<sub>w</sub> x o<sub>h</sub> px</em>
}
else
{
  new<sub>w</sub> = R<sub>o</sub> * i<sub>h</sub>
  segment = (i<sub>w</sub> - new<sub>w</sub>) / 2
  zetnij pas o szerokości <em>segment</em> z lewej i prawej
  i przeskaluj do rozmiarów <em>o<sub>w</sub> x o<sub>h</sub> px</em>
}</pre>
<p>Przy implementacji  powyższego rozwiązania w języku PHP do ścinania i skalowania przydatna może okazać się funkcja <em><a href="http://php.net/imagecopyresampled">imagecopyresampled()</a>.</em></p>


<p>Podobne wpisy:<ol><li><a href='http://code42.pl/2009/03/05/refaktoryzacja-css-%e2%80%94-jednak-cos-mozna/' rel='bookmark' title='Refaktoryzacja CSS — jednak coś można'>Refaktoryzacja CSS — jednak coś można</a></li>
<li><a href='http://code42.pl/2010/04/04/dwukolumnowa-lista-definicji-edit-w-html5-lista-opisow/' rel='bookmark' title='Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))'>Dwukolumnowa lista definicji (edit: w HTML5 lista opisów (?))</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://code42.pl/2009/04/17/jak-przycinac-i-skalowac-obrazki/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

