| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Advanced Thumbnail Creator
© Жупаненко Андрей 1 ЗадачаРаботая с новостными лентами или же просто с информацией, содержащей графические изображения, довольно часто возникает потребность генерации картинок-превью. На первый взгляд нет ничего проще чем создать уменьшенное изображение произвольного рисунка или фотографии. Однако оказывается и в этой области есть где развернуться. 2 Существующие решенияЕсть несколько способов решения данной задачи:
Очевидное преимущество первых трех методов - полная автоматизация процесса. Недостатки: в первом случае изображение загружается в оригинальном размере (рис. 2а), во втором - в превью не сохраняются оригинальные пропорции изображения (рис. 2б), в третьем - центральная часть изображения не всегда является "значащей" (рис. 2в). Четвертый способ генерации превью дает необходимые результаты (рис. 2г), но добавляет лишние хлопоты при переключении между приложениями, возникает необходимость загрузки двух файлов вместо одного (в лучшем случае).
Рисунок 1 - Исходное изображение Рисунок 2 - Результаты генерации превью (70x70) 3 РешениеСуть метода - автоматическое создание превью с помощью php-скрипта посредством ручного выделения "значащей" области. 4 Используемые технологииPHP, Javascript, DOM, CSS, HTML 5 Кросс-браузерностьInternet Explorer 6.0,7.0; FireFox 1.0,2.0; Opera 9.0; Safari 2.0; 6 Входные и выходные параметрыВходные параметры: Выходные параметры: 7 РеализацияРазработанный программный комплекс состоит из двух файлов. 7.1. Описание функций модуля thumbcreate.js. //initialization
function init()
{
document.getElementById("image").onclick=mouseHandler;
document.getElementById("image").onmousemove=mouseHandler;
document.getElementById('th_w').value=thumbWidth;
document.getElementById('th_h').value=thumbHeight;
}
//mouse handler
function mouseHandler(mouseEvent)
{
if (!mouseEvent) mouseEvent = window.event;
if (mouseEvent.button == 2) return;
var element = (mouseEvent.target)?mouseEvent.target:mouseEvent.srcElement;
//for a clique we begin to draw a selection rectangle
if (mouseEvent.type=="click")
{
var x = mouseEvent.clientX - document.getElementById("image").offsetLeft;
var at = mouseEvent.clientY - document.getElementById("image").offsetTop;
pointSet(x,y);
rectangleDraw('area');
};
//draw the selection region during mouse motion
if (mouseEvent.type=="mousemove")
{
.
}
}
//setting coordinates for top left and right bottom corner
function pointSet(x,y)
{
if (!ptype)
{
x1=x+document.body.scrollLeft;
y1=y+document.body.scrollTop;
rectangleHide('area');
inputUpdate();
}
else
{
x2=x+document.body.scrollLeft;
y2=y+document.body.scrollTop;
pointCorrect();
inputUpdate();
}
ptype = !ptype;
}
//correcting TL BR coordinates if they are switched
function pointCorrect(x1c,y1c,x2c,y2c)
{
.
}
//rectangle drawing (x1,y1); (x2,y2)
function rectangleDraw(rectId)
{
.
}
// rectangle drawing from input fields
function rectangleDrawInput(rectId)
{
.
}
//rectangle hiding
function rectangleHide(rectId)
{
.
}
//input fields update functions
function inputUpdate()
{
.
}
function inputWidthUpdate()
{
.
};
function inputHeightUpdate()
{
.
};
function inputXYUpdate()
{
.
};
//prepare for thumbnail generation
function generateImageThumb()
{
var previewclass='preview';
var previewimage='/preview.gif';
var links=document.getElementsByTagName('a');
var prevlinks=new Array();
var c=0;
var previewTest = new RegExp("(^|s)" + previewclass + "(s|$)");
for(I=0; I<links.length; I++)
{
if (previewTest.test(links[I].className))
prevlinks[c]=links[I]; c++; }
}
for(I=0; I<prevlinks.length; I++)
{
var newa=document.createElement('a');
newa.style.textDecoration="none";
var newbutton=document.createElement('input');
newbutton.type="button";
newbutton.value="Generate Thumbnail"
newa.appendChild(newbutton);
newa.href="#";
var newbr=document.createElement('br');
newa.appendChild(newbr);
newa.onclick=function()
{
if(this.getElementsByTagName('img')[0])
this.removeChild(this.getElementsByTagName('img')[0]);
var newimg=document.createElement('img');
newimg.style.border="0";
newimg.vspace="10";
this.appendChild(newimg);
var rand=parseInt(1000*Math.random());
newimg.src="?action=generate&r="+rand+"&x1="+document.getElementById('x1_inp').value+
"&y1="+document.getElementById('y1_inp').value+"&x2="+document.getElementById('x2_inp').value+
"&y2="+document.getElementById('y2_inp').value+"&w="+document.getElementById('th_w').value+
"&h="+document.getElementById('th_h').value+"&fn="+document.getElementById('fileName').value;
return false;
}
prevlinks[I].parentNode.insertBefore(newa,prevlinks[I].nextSibling);
}
}
//initialization
window.onload=function()
{
init();
generateImageThumb();
}
7.2. Описание функций модуля thumbcreate.php. <?php
if (!$_GET[thumbwidth]) $_GET[thumbwidth]=0;
if (!$_GET[thumbheight]) $_GET[thumbheight]=0;
//thumbnail creation function
function createthumb($new_w,$new_h,$x1,$y1,$x2,$y2,$fn)
{
$src_img=imagecreatefromjpeg($_GET['fn']);
$dst_img=ImageCreateTrueColor($new_w,$new_h);
imagecopyresampled($dst_img,$src_img,0,0,$x1,$y1,$new_w,$new_h,$x2-$x1,$y2-$y1);
//output to browser
imagejpeg($dst_img);
//output to file
imagejpeg($dst_img,substr($_GET['fn'],0,-4)."_th.jpg");
imagedestroy($dst_img);
imagedestroy($src_img);
}
if ($_GET[action]=="generate")
{
header('Content-type:image/jpeg');
createthumb($_GET['w'],$_GET['h'],$_GET['x1'],$_GET['y1'],$_GET['x2'],$_GET['y2'],$_GET['fn']);
}
?>
//working area
<div id="image" style="cursor: crosshair; width:<?= $imgWidth ?>px;
height:<?= $imgHeight ?>px; border-width:0; background-image: url('<?= $_GET[filename] ?>') ">
<div id="area"></div>
</div>
//input-output form
<form action="" method="post">
<table width="<?=$imgWidth?>px">
<tr>
<td width="33%" align=center>
TL (x1, y1) = (<input type="text" id="x1_inp" value="0" class="atc1" onChange="inputXYUpdate();">,
<input type="text" id="y1_inp" value="0" class="atc1" onChange="inputXYUpdate();">)<br>
BR (x2, y2) = (<input type="text" id="x2_inp" value="0" class="atc1" onChange="inputXYUpdate();">,
<input type="text" id="y2_inp" value="0" class="atc1" onChange="inputXYUpdate();">)<br></td>
<td width="33%" align=center>
Width =
<input type="text" id="th_width" value="0" class="atc2" onChange="inputWidthUpdate();"><br>
Height =
<input type="text" id="th_height" value="0" class="atc2" onChange="inputHeightUpdate();"><br></td>
<td width="33%" align=center>
Thumbnail width = <input type="text" id="th_w" value="" class="atc2"><br>
Thumbnail height = <input type="text" id="th_h" value="" class="atc2"><br></td></tr>
<tr><td colspan=3 align=center><BR><a href="/none.gif" class="preview"></a></td></tr>
</table><input type="hidden" value="<?= $fileInput ?>" id="fileName"></form>
8 Пример работы скрипта
9 Ссылки10 Исходный код
Advanced Thumbnail Creator:
atc.zip Рубрика: Java Script
Подгрузка через AJAX HTML-кода, содержащег....
При разработке CMS S.Builder наша команда активно использовала AJAX. Теперь вот решили поделиться накопленным опытом. Начнем с этого хабратопика. Не буду здесь затрагивать различные фреймворки и библиотеки. Свой код всегда роднее. Для работы с AJAX-ом в S.Builder написана библиотека sbAJAX. Можете качать и пользоваться :). В этом файле есть функция sbEvalJS. Для тех, кто не знает, объясню. При подгрузке через AJAX и вставке на страницу HTML-кода, содержащего JavaScript, JavaScript выполняться не будет или полезут баги. Эта функция как раз решает поставленную задачу.
Подробнее... |
Рубрика: AJAX
| Добавлено: 19.11.2008
Обзор нового релиза самой мощной Ajax библ....
Хотя наш обзор немного запоздал, оригинальный Dojo 1.2 вышел в релизной версии ещё 6-го октября, но сейчас мы наверстаем упущенное. И так, Dojo Toolkit — это самая мощная и гибкая ajax-библиотека из всех, что есть на рынке, она активно развивается и имеет большое комьюнити. Кстати, это самое комьюнити, совместно с компанией Sitepen, имеет ещё несколько проектов, среди которых и Cometd и некоторые другие, не менее интересные, о которых мы скоро вам расскажем. Сегодня же все внимание на флагманский продукт — Dojo 1.2.
Подробнее... |
Рубрика: AJAX
| Добавлено: 19.11.2008
Firebug 1.3 и 1.4 alpha — что нового и инт....
Если вы профессиональный веб-разработчик и постоянно имеете дело с разработкой и отладкой сложных AJAX приложений, то наверняка знаете и используете Firebug — плагин для браузера Firefox, предназначенный для отладки и исследования веб-приложений. Текущая его версия, 1.2х достаточно стабильная и функциональна, чтобы помочь в 99% проблем, которые могут возникнуть при разработке. Но и этот инструмент не лишён если не недостатков, то некоторых фич, которые могли бы облегчить работу. И даже идеальный инструмент можно сделать ещё более идеальным, как бы это не звучало.
Подробнее... |
Рубрика: Вебмастеру
| Добавлено: 19.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|