Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   resize изображения и аналог getimagesize() (https://javascript.ru/forum/misc/34346-resize-izobrazheniya-i-analog-getimagesize.html)

Vdomah 30.12.2012 12:43

resize изображения и аналог getimagesize()
 
Хочу реализовать для js-галереи (http://learn.javascript.ru/play/tuto...ery/index.html) красивое отображение вертикальных и горизонтальных картинок в паспарту одного размера. На ПХП делал так: getimagesiz'ом сравнивал width и height и по результату присваивал картинке один из двух стилей.

Нашел аналог getimagesize для js: http://www.rsdn.ru/forum/web/987244.1
Подставляю эту функцию и пытаюсь присвоить ширину и высоту
function showThumbnail(href, title) {
  var is = getImageSize( 'largeImg');
  largeImg.src = href;
  largeImg.alt = title;
  if (is.width > is.height) largeImg.width = is.width;
  else largeImg.height = is.height;
}

Должно по идее присваивать или ширину или высоту изначальной картинки. Вроде присвоение работает но ужасно. Изображения растягиваются, а иногда при повторном нажатии на один и тот же thumbnail картинка растягивается по вертикали.
function showThumbnail(href, title) {
  var is = getImageSize( 'largeImg');
  largeImg.src = href;
  largeImg.alt = title;
  if (is.width > is.height) largeImg.width = is.width;
/* else largeImg.height = is.height;*/
}

В таком виде ширина у всех картинок одинакова, ничего не растягивается, но вертикальные картинки выходят за паспарту.
function showThumbnail(href, title) {
  var is = getImageSize( 'largeImg');
  largeImg.src = href;
  largeImg.alt = title;
  if (is.width < is.height) largeImg.height = is.height;
/* else largeImg.height = is.height;*/
}

Если так - то же самое, что и в первом варианте.

Т.е. выходит, что ширина нормально присваивается, а высота нет.
Я новичок, так что простите за банальные вопросы. Может все вообще не этим путем надо решать?

Deff 30.12.2012 12:55

не проще банально задавать атрибутом в картинке ?

<img src="http://s2.uploads.ru/H43vD.jpg" width="200" />


или через стиль
<style>
 #Wrap-block img{
 width:200px;
 height:auto;
 max-height:350px!important;
}
</style>

Vdomah 30.12.2012 13:04

у меня картинки в квадратном паспарту отображаются. в этом случае нельзя присвоить стандартную высоту или ширину, т.к. если картинка вертикальная, то с фиксированной шириной будет вылазить за пределы поля.
Так делал на ПХП:
<img class="
<?php 	if($size[0] > $size[1])
		{
			echo 'goriz';
		}
		else echo 'vert';
?>

.goriz{
	display: block;
	margin: 25px auto;
	width: 500px;
}

.vert{
	display:block;
	margin: 10px auto;
	height: 500px;
}

Deff 30.12.2012 13:07

Цитата:

Сообщение от Vdomah
то с фиксированной шириной будет вылазить за пределы поля.

см точный вид стиля - там ограничение по высоте!

<style>
 #Wrap-block img{
 width:200px;
 height:auto;
 max-height:350px!important;
}
</style>


<div id=Wrap-block>
<img src="http://s2.uploads.ru/H43vD.jpg" />
<img src="http://images2.layoutsparks.com/1/95613/water-dragon-animal-image.jpg" />
<img src="http://media.professionali.ru/processor/commentimages/original/2011/12/31/500.jpg" />
<img src="http://s3.uploads.ru/2yB5d.jpg" />
</div>

по-ходу нужно искать картинки с пропорциями длинных и узких (height/width > X) и им принудительно выставлять атрибут width
(Хотя вродь делал через стиль(может вру

Vdomah 30.12.2012 14:32

max-height не спасает
<style>.galcont{	/*паспарту для картин*/
	height: 550px;
	width: 550px;
	background-color: #E7E6E9;
	border: 1px solid grey;
	margin: auto;
}
#largeImg {
	width: 500px;
/*	height: 400px;*/
	display: block;
	margin: auto;
}
</style>

<div class="galcont">
<p><img id="largeImg" src="http://media.professionali.ru/processor/commentimages/original/2011/12/31/500.jpg" alt="Large image"></p>
</div>

Хотел сделать просмотр, но пока не разобрался как.

Так вот, max-height не спасает, потому что при вертикальном img нужно ограничить по высоте - тогда будет маленький width. Горизонталь - наоборот: width на максимум, а height маленький.

Deff 30.12.2012 14:52

Цитата:

Сообщение от Vdomah
Так вот, max-height не спасает, потому что при вертикальном img нужно ограничить по высоте - тогда будет маленький width. Горизонталь - наоборот: width на максимум, а height маленький.

Ну этого не избежать по любому, если размеры паспарту идентичные, но при центрировании будет выглядеть терпимо,
правдо центрирование по высоте мон выполнить только при паспарту таблицей

Deff 30.12.2012 14:55

Цитата:

Сообщение от Vdomah
Хотел сделать просмотр, но пока не разобрался как.

[HTML run]Тут HTML[/HTML]

Vdomah 30.12.2012 15:04

Пытался тут илюстрацию загрузить, но лажа получается. Короче, вопрос свелся вот к этому:
if (is.width > is.height) largeImg.width = '500';
	else largeImg.height = '500';

Где is.width и is.height - результаты выполнения функции getImageSize.

В этом месте что-то не работает. Хотя работает, но присваивает какую-то лабуду.

Vdomah 30.12.2012 15:17

http://www.bulgakova.in.ua/gallery/index/all
Вот илюстрация если чем-то поможет.

dmitriymar 30.12.2012 15:53

Цитата:

Сообщение от Vdomah
if (is.width > is.height) largeImg.width = '500';
else largeImg.height = '500';

Где is.width и is.height - результаты выполнения функции getImageSize.

В этом месте что-то не работает. Хотя работает, но присваивает какую-то лабуду.

....
Цитата:

Сообщение от Vdomah
#largeImg {
09 width: 500px;
10 /* height: 400px;*/
11 display: block;
12 margin: auto;

нтмл учите.
http://htmlbook.ru/html/img/height
http://htmlbook.ru/html/img/width
-не нужно высоту или ширину предварительно задавать у тега вообще.
Цитата:

Сообщение от Vdomah
1 function showThumbnail(href, title) {
2 var is = getImageSize( 'largeImg');
3 largeImg.src = href;
4 largeImg.alt = title;
5 if (is.width > is.height) largeImg.width = is.width;
6 else largeImg.height = is.he

а здесь собственно вопрос-сравнение размеров заданных в теге img . А может всётаки сравнивать размеры нужно приходящего изображения ,после его полного получения ?:) скрипт -на помойку


-так же обратите внимание на единицы измерения

Vdomah 30.12.2012 16:31

не знаю зачем Вы мне эти ссылки кинули, но я допер в чем проблема. Просто надо при задании параметров
if (is.width > is.height) largeImg.width = '500';
    else largeImg.height = '500';

удалять заданный ранее, а то получается квадрат. спасибо всем за помощь!

#largeImg {
09 /*width: 500px;*/
10 /* height: 400px;*/
11 display: block;
12 margin: auto;

закомментил - ничего не поменялось

Vdomah 30.12.2012 16:44

function showThumbnail(href, title) {
  var is = getImageSize( 'largeImg');
  largeImg.src = href;
  largeImg.alt = title;
  if (is.width > is.height) {
  largeImg.width = '500';
  largeImg.removeAttribute('height');
  }
	else {
	largeImg.height = '500';
	largeImg.removeAttribute('width');
	}
}

Типа того.
Цитата:

А может всётаки сравнивать размеры нужно приходящего изображения ,после его полного получения.
Это да, а то сейчас правильный размер ставится только после второго нажатия по thumb.

dmitriymar 30.12.2012 16:46

Цитата:

Сообщение от Vdomah
не знаю зачем Вы мне эти ссылки кинули, но я допер в чем проблема. Просто надо при задании параметров

Цитата:

Сообщение от Vdomah
удалять заданный ранее, а то получается квадрат. спасибо всем за помощь!

странно -у вас вышло? я удивлён :)
Цитата:

Сообщение от dmitriymar
-не нужно высоту или ширину предварительно задавать у тега вообще.

а в этих ссылках разве нет как работают атрибуты ширина и высота?
а по ссылкам нужно всётаки ознакомиться

Цитата:

Сообщение от Vdomah
но я допер в чем проблема.

Не доперли вы в чём проблема . Вобще ни капли не доперли

Цитата:

Сообщение от Vdomah
Это да, а то сейчас правильный размер ставится только после второго нажатия по thumb.

это типо одолжение?
а изображения нужно готовить на сервере , при их загрузке на сервер

Deff 30.12.2012 17:07

if(Math.round(largeImg.height)/Math.round(largeImg.width) > 550/550) {largeImg.height='550px';largeImg.width="auto"}

Vdomah 30.12.2012 17:41

Цитата:

Сообщение от Vdomah (Сообщение 224378)
function showThumbnail(href, title) {
  var is = getImageSize( 'largeImg');
  largeImg.src = href;
  largeImg.alt = title;
  if (is.width > is.height) {
  largeImg.width = '500';
  largeImg.removeAttribute('height');
  }
	else {
	largeImg.height = '500';
	largeImg.removeAttribute('width');
	}
}



Это да, а то сейчас правильный размер ставится только после второго нажатия по thumb.

dmitriymar, никакого сарказма. Вы здесь правильную идею дали. Надо было просто строчку
var is = getImageSize( 'largeImg');
поставить после загрузки изображения, т.е.
largeImg.src = href;

function showThumbnail(href, title) {
  largeImg.src = href;
  largeImg.alt = title;
  var is = getImageSize( 'largeImg');
  if (is.width > is.height) {
  largeImg.width = '500';
  largeImg.removeAttribute('height');
  }
	else {
	largeImg.height = '500';
	largeImg.removeAttribute('width');
	}
}

И все красиво.

dmitriymar 30.12.2012 17:59

Цитата:

Сообщение от Vdomah
поставить после загрузки изображения, т.е.
largeImg.src = href;

это не загрузка изображения -это указание адреса изображения.
и "работает" это только потому что изображения закешировались.
а при полной загрузке изображения возникает событие onload

Vdomah 30.12.2012 18:36

По-моему, для этого галерее изначально была эта функция:
/* предзагрузка */
var imgs = thumbs.getElementsByTagName('img');
for(var i=0; i<imgs.length; i++) {
  var url = imgs[i].parentNode.href;
  var img = document.createElement('img');
  img.src = url;
}

Удалил кэш - все по прежнему работает.

Я бы остановился, но просто интересно как надо бы с onload правильно сделать?

dmitriymar 30.12.2012 18:47

img.src = url;
img.onload=function(){alert('загрузилось')}
alert('меняем размеры')

Цитата:

Сообщение от Vdomah
Я бы остановился, но просто интересно как надо бы с onload правильно сделать?

а вообще для подобного есть гугл. а скрипт -на свалку-без вариантов

Vdomah 30.12.2012 19:42

как onload работает я знаю. интересовала конкретная реализация.
последний совет конечно ок. только заработало - на свалку. а предложения по делу...

devote 30.12.2012 20:31

Цитата:

Сообщение от Vdomah
Нашел аналог getimagesize для js: http://www.rsdn.ru/forum/web/987244.1

аналог то говно, размер он не покажет если браузер не успел загрузить картинку.

Вот так нужно примерно:
function getImageSize(src, callback) {
    var img = new Image();
    img.onload = img.onerror = function() {
        callback(img.width, img.height);
    }
    img.src = src;
}

getImageSize('http://javascript.ru/forum/image.php?u=25460&dateline=1356854759', function(w, h){
    alert([w, h]);
});

Vdomah 30.12.2012 21:09

devote, большое спасибо!


Часовой пояс GMT +3, время: 19:36.