Изображение в градациях серого

Подскажите как реализовать подобное. На сайте использую плагин Synio Flow, и хотелось бы немного модифицировать изображения, а именно выводить на главной в градацией серого, но при наведение курсора чтобы становились цветными. (собственно пример тут).

Нашел по этому поводу статью, но не совсем понимаю как теперь это все подключить чтобы получить желаемый эффект.

Подскажите с чего начать, куда вставлять код. Спасибо за любую помощь.

25 комментариев

avatar
не особо в этом разбираюсь, методом тыка попробовал добавить этот скрипт в /templates/skin/synio/topic_photoset.tpl сразу после

<script type="text/javascript">
        jQuery(window).load(function($) {
                ls.photoset.showMainPhoto({$oTopic->getId()});
        });
</script>

но выскакивает ошибка
avatar
вот и я вчера экспериментировал и тоже все с ошибками. Быть может сейчас с новыми силами что-то у меня получится :) если что отпишусь
avatar
о, классная идея
тоже хочу )
avatar
Попробовал сделать, получилось вроде симпатишно. Делал на основе обычного шаблона Synio, за правильность jquery-кода не отвечаю, как смог :)

1. Файл topic_photoset.tpl: заменить самый верхний код на этот
{include file='topic_part_header.tpl'}

<script type="text/javascript">
	jQuery(window).load(function($) {
		ls.photoset.showMainPhoto({$oTopic->getId()});
	});
</script>

<script type="text/javascript">
	$(document).ready(function() {
        var hideshadow = function() {
           $(".preview-shadow").fadeTo("slow", 0.6);
        };
        var showshadow = function() {
           $(".preview-shadow").fadeTo("slow", 0);
        };

        $(".topic-photo-preview").mouseout(hideshadow);
        $(".topic-photo-preview").mouseover(showshadow);
	});
</script>

<div class="topic-photo-preview" id="photoset-main-preview-{$oTopic->getId()}" onclick="window.location='{$oTopic->getUrl()}#photoset'">
	{assign var=oMainPhoto value=$oTopic->getPhotosetMainPhoto()}

	<div class="topic-photo-count" id="photoset-photo-count-{$oTopic->getId()}">{$oTopic->getPhotosetCount()} {$aLang.topic_photoset_photos}</div>

	{if $oMainPhoto->getDescription()}
		<div class="topic-photo-desc" id="photoset-photo-desc-{$oTopic->getId()}">{$oMainPhoto->getDescription()}</div>
	{/if}

    <div class="preview-shadow"></div>
    <img src="{$oMainPhoto->getWebPath(500)}" alt="image" id="photoset-main-image-{$oTopic->getId()}" />
</div>

2. css/topic.css: найти примерно 100 строку и заменить эти 2 строки
.topic.topic-type-photoset .topic-photo-preview img { vertical-align: top; position:relative; z-index:5 }
.topic.topic-type-photoset .topic-photo-preview .topic-photo-count { z-index:7; display: none; cursor: pointer; position: absolute; top: 5px; right: 5px; background: #000; color: #6bd24b; padding: 4px 7px; background: rgba(0,0,0,.6); }

3. css/topic.css: после предыдущих замен добавить ещё такую строку
.topic.topic-type-photoset .topic-photo-preview .preview-shadow { background:#333; width:100%; height:100%; display:block; position:absolute; z-index:6; opacity:0.6; }

4. Если включено кэширование — почистить.
avatar
Хотя, можно легко подключить скрипт из ссылки в топике.

1. В topic_photoset.tpl заменить строку
<img src="{$oMainPhoto->getWebPath(500)}" alt="image" id="photoset-main-image-{$oTopic->getId()}" />
на
<img src="{$oMainPhoto->getWebPath(500)}" alt="image" class="image-sh" id="photoset-main-image-{$oTopic->getId()}" />

2. В этом же файле после первого скрипты вставить скрипт из того примера и обернуть в literal, чтобы получилось:
{literal}
здесь jquery-код с той страницы-примера
{/literal}

3. В css/topic.css в строке
.topic.topic-type-photoset .topic-photo-preview .topic-photo-count добавить z-index:1000
avatar
ооо
ща буду пробовать
спс
avatar
100500 раз все испробовал, мб выложте код topic.css и topic_photoset.tpl
avatar
Забыл добавить: в этом jquery-коде, который вставляем, нужно все .item img заменить на .image-sh.
avatar
В коде что любезно представлен нет не одной .item img
Два файла выложить трудно, объяснения мутные. Ссылки на рабочую версию для LS нету, все понятно)
avatar
Что непонятного сделать все поэтапно и самостоятельно, а то так и буду вопрос за вопросом.

Вот jquery-код который нужно вставить. Остальное все по пунктам выше.
avatar
*будут

Все же написано и расписано, хоть немного-то подумайте.
avatar
подумал
Вот код topic_photoset.tpl

{include file='topic_part_header.tpl'}


<script type="text/javascript">
	jQuery(window).load(function($) {
		ls.photoset.showMainPhoto({$oTopic->getId()});
	});
</script>


{literal}
<script src="jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">

	// On window load.
	$(window).load(function(){

		// Fade in images so there isn't a color "pop" document load and then on window load
		$(".image-sh").fadeIn(500);

		// clone image
		$('.image-sh').each(function(){
			var el = $(this);
			el.css({"position":"absolute"}).wrap("<div class='img_wrapper' style='display: inline-block'>").clone().addClass('img_grayscale').css({"position":"absolute","z-index":"998","opacity":"0"}).insertBefore(el).queue(function(){
				var el = $(this);
				el.parent().css({"width":this.width,"height":this.height});
				el.dequeue();
			});
			this.src = grayscale(this.src);
		});

		// Fade image
		$('.image-sh').mouseover(function(){
			$(this).parent().find('img:first').stop().animate({opacity:1}, 1000);
		})
		$('.img_grayscale').mouseout(function(){
			$(this).stop().animate({opacity:0}, 1000);
		});
	});

	// Grayscale w canvas method
	function grayscale(src){
		var canvas = document.createElement('canvas');
		var ctx = canvas.getContext('2d');
		var imgObj = new Image();
		imgObj.src = src;
		canvas.width = imgObj.width;
		canvas.height = imgObj.height;
		ctx.drawImage(imgObj, 0, 0);
		var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
		for(var y = 0; y < imgPixels.height; y++){
			for(var x = 0; x < imgPixels.width; x++){
				var i = (y * 4) * imgPixels.width + x * 4;
				var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
				imgPixels.data[i] = avg;
				imgPixels.data[i + 1] = avg;
				imgPixels.data[i + 2] = avg;
			}
		}
		ctx.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
		return canvas.toDataURL();
    }
</script>
{/literal}


{assign var=oMainPhoto value=$oTopic->getPhotosetMainPhoto()}
{if $oMainPhoto}
<div class="topic-photo-preview" id="photoset-main-preview-{$oTopic->getId()}" onclick="window.location='{$oTopic->getUrl()}#photoset'">
	<div class="topic-photo-count" id="photoset-photo-count-{$oTopic->getId()}">{$oTopic->getPhotosetCount()} {$aLang.topic_photoset_photos}</div>
	
	{if $oMainPhoto->getDescription()}
		<div class="topic-photo-desc" id="photoset-photo-desc-{$oTopic->getId()}">{$oMainPhoto->getDescription()}</div>
	{/if}
	
	<img src="{$oMainPhoto->getWebPath(500)}" alt="image" class="image-sh" id="photoset-main-image-{$oTopic->getId()}" />
</div>
{/if}

{assign var=iPhotosCount value=$oTopic->getPhotosetCount()}
<div class="topic-content text">
	{hook run='topic_content_begin' topic=$oTopic bTopicList=$bTopicList}
	
	{if $bTopicList}
		{$oTopic->getTextShort()}
		{if $oTopic->getTextShort()!=$oTopic->getText()}
			<br />
			<a href="{$oTopic->getUrl()}#cut" title="{$aLang.topic_read_more}">
				{if $oTopic->getCutText()}
					{$oTopic->getCutText()}
				{else}
					{$aLang.topic_photoset_show_all|ls_lang:"COUNT%%`$iPhotosCount`"} →
				{/if}                           
			</a>
		{/if}
	{else}
		{$oTopic->getText()}
	{/if}
	
	{hook run='topic_content_end' topic=$oTopic bTopicList=$bTopicList}
</div> 


{if !$bTopicList}
	<script type="text/javascript" src="{cfg name='path.root.engine_lib'}/external/prettyPhoto/js/prettyPhoto.js"></script>	
	<link rel='stylesheet' type='text/css' href="{cfg name='path.root.engine_lib'}/external/prettyPhoto/css/prettyPhoto.css" />
	<script type="text/javascript">
		jQuery(document).ready(function($) {	
			$('.photoset-image').prettyPhoto({
				social_tools:'',
				show_title: false,
				slideshow:false,
				deeplinking: false
			});
		});
	</script>
	
	
	<div class="topic-photo-images">
		<h2>{$oTopic->getPhotosetCount()} {$oTopic->getPhotosetCount()|declension:$aLang.topic_photoset_count_images}</h2>
		<a name="photoset"></a>
		
		<ul id="topic-photo-images">
			{assign var=aPhotos value=$oTopic->getPhotosetPhotos(0, $oConfig->get('module.topic.photoset.per_page'))}
			{if count($aPhotos)}                                
				{foreach from=$aPhotos item=oPhoto}
					<li><a class="photoset-image" href="{$oPhoto->getWebPath(1000)}" rel="[photoset]"  title="{$oPhoto->getDescription()}"><img src="{$oPhoto->getWebPath('50crop')}" alt="{$oPhoto->getDescription()}" /></a></li>                                    
					{assign var=iLastPhotoId value=$oPhoto->getId()}
				{/foreach}
			{/if}
			<script type="text/javascript">
				ls.photoset.idLast='{$iLastPhotoId}';
			</script>
		</ul>
		
		{if count($aPhotos)<$oTopic->getPhotosetCount()}
			<a href="javascript:ls.photoset.getMore({$oTopic->getId()})" id="topic-photo-more" class="topic-photo-more">{$aLang.topic_photoset_show_more} ↓</a>
		{/if}
	</div>
{/if}

 
{include file='topic_part_footer.tpl'}


И topic.css
/* --------------------------------------------
	ТОПИК
-------------------------------------------- */
.topic.topic-type-photoset .topic-photo-preview .topic-photo-count { display: none; cursor: pointer; position: absolute; top: 5px; z-index:1000; right: 5px; background: #000; color: #6bd24b; padding: 4px 7px; background: rgba(0,0,0,.6); }


И всеравно ничего не пашет.
avatar
Чудно. Чистку кэша делали?

И ещё, эту строку можно удалить. Jquery в движке по стандарту подключен.
<script src="jquery.min.js" type="text/javascript"></script>
avatar
кеш чистил

удалю сейчас
avatar
Можно ссылку на итог, если не секрет? Просто интересно как это в деле будет выглядеть)
avatar
В топике есть ссылка.
avatar
Есть специальный плагин для этого. Всё делается просто подключением css и js
avatar
Спасибо большое за наводку. С подключением css и js понятно, а вот этот код куда вставлять

$('#image1').adipoli({
    'startEffect' : 'normal',
    'hoverEffect' : 'popout'
});
avatar
Думаю, если в файле topic_photoset.tpl, то вероятно нужно как-то объединить с этим
<img src="{$oMainPhoto->getWebPath(500)}" alt="image" id="photoset-main-image-{$oTopic->getId()}" />
avatar
Такое можно на CSS3 реализовать вот так
avatar
Вот так выглядит в градации серого главная у меня на сайте. сделал как посоветовал Shrike на css3, но работает только в хроме, в опере проверял и ие не работает. Но я пока поставил ради эксперимента, если не приживется верну обратно :)
avatar
вернул пока все обратно так как в ФФ картинки не отображаются вообще… корректно работает только в хроме
avatar
в фф отображались только при наведении курсора
avatar
А способо тов. bamboo рассматривался?
avatar
Ну да, работает только в Chrome и Firefox
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.