В настоящее время я работаю над решением jQuery, где я хочу загружать изображения из RSS-канала Flickr.Меня не устраивает размер по умолчанию, который я получаю из фида - я хочу, чтобы загружаемые изображения были равны или превышают height элемента обертки, в котором я их отображаю. (Шириназдесь не проблема.)
Согласно их документации API , Flickr имеет систему размера изображения, которая выглядит следующим образом:
s small square 75x75
t thumbnail, 100 on longest side
m small, 240 on longest side
- medium, 500 on longest side
z medium 640, 640 on longest side
b large, 1024 on longest side*
o original image, either a jpg, gif or png, depending on source format
* Before May 25th 2010 large photos only exist for very large original images
Это означает, что естьнет гарантированной высоты - мне нужно проверять высоту для каждого изображения, которое я хочу загрузить.Пример: если изображение представляет собой панораму, и я загружаю большой размер, высоты, вероятно, все еще недостаточно для заполнения моего элемента-обертки.Это потому, что самой длинной стороной будет ширина, и она будет 1024.
Чтобы усложнить ситуацию, высота оболочки может изменяться - не динамически после загрузки страницы, а от страницы к странице.На некоторых страницах это 300 пикселей, на других - 100 пикселей и т. Д.
Насколько я понимаю, единственный способ получить высоту файла изображения - это загрузить его.Итак, я написал некоторый рекурсивный код, который загружает изображение, смотрит на его высоту и, если этого недостаточно, снова вызывает себя для загрузки следующего размера.В текущей версии он начинается с наименьшего размера и работает до тех пор, пока не найдет подходящее изображение или максимально возможное изображение.
Вот код:
$.getJSON(ajaxContentURL, function(data) {
var flickrImages = [];
// An array of object with data pertaining Flickr's image sizes
var flickrImageSizes = [{ size: "small square", pixels: 75, letter: "_s" },
{ size: "thumbnail", pixels: 100, letter: "_t" },
{ size: "small", pixels: 240, letter: "_m" },
{ size: "medium", pixels: 500, letter: "" },
{ size: "medium 640", pixels: 640, letter: "_z" },
{ size: "large", pixels: 1024, letter: "_b"}];
$.each(data.items, function(index, item) {
flickrImages.push(loadFlickrImage(item, 0));
});
function loadFlickrImage(item, sizeIndex) {
var path = item.media.m;
var imgSrc = path.replace("_m", flickrImageSizes[sizeIndex].letter);
var tempImg = $("<img />").attr("src", imgSrc);
tempImg.load(function() {
// Is it still smaller? Load next size
if (this.height < el.data("scrollableAreaHeight")) {
// Load a bigger image, if possible
if ((sizeIndex + 1) < flickrImageSizes.length) {
loadFlickrImage(item, sizeIndex + 1);
} else {
return this;
}
else {
return this;
}
});
}
});
Это немного грубопо краям, но я надеюсь, что вы получите изображение.
Это работает, но это просто кажется расточительным - загружать столько версий изображения, чтобы получить нужный размер?
У вас есть предложения по улучшению?Я думаю, что это должно начаться с квалифицированного предположения, какой может быть лучший размер, и загрузить его первым.Затем он увидит, подходит ли он или слишком мал или слишком велик, и загрузит следующее или предыдущее изображение в размерном масштабе.Таким образом, вы можете уменьшить количество загружаемых изображений, чтобы получить нужный размер.
Еще лучше: есть ли способ узнать размеры изображения без загрузки реальных файлов изображений?Помните, что у меня нет доступа к полному API Flickr - я просто получаю доступ к JSON-ленте, как этот .
Буду признателен за любые отзывы!
Заранее спасибо!