Raphael.js - изображение с оригинальной шириной и размером?
Привет, пользователи RaphaelJS =),
У меня, может быть, вопрос немой, но я не могу найти ответ. Дело в том, что я пытаюсь загрузить/создать изображение с Рафаэлем, это прекрасно, вот так:
var image_1 = paper.image('/img/img1.jpg', 0, 0, 100, 100);
Но, как вы можете видеть, всегда кажется, что вам нужно дать свойства "ширина" и "высота", я уже проверил документацию, но всегда был коротким и не таким подробным, и я попытался дать нулевые параметры или пустые параметров, но он не работает...
Итак, мне интересно, есть ли на самом деле прямой способ в raphael, чтобы сделать это, или.... Я должен всегда получать эти значения до???
Я имею в виду, что-то вроде этого?:
var imgURL = "../img/img1.jpg"
var myImg = new Image();
myImg.src = imgURL;
var width = myImg.width;
var height = myImg.height;
//create the image with the obtained width and height:
var image_1 = paper.image('/img/img1.jpg', 0, 0, width, height);
И так я загружаю оригинальный размер изображения, и этот вопрос решает мою проблему, но.... нет пути внутри Рафаэля, чтобы сделать это???
Ответы
Ответ 1
На данный момент... Наверное, мне придется ответить на свой вопрос собственным ответом, потому что, похоже, нет другого способа, который я нашел, или что кто-то сказал мне = P
var imgURL = "../img/img1.jpg"
var myImg = new Image();
myImg.src = imgURL;
var width = myImg.width;
var height = myImg.height;
//create the image with the obtained width and height:
var image_1 = paper.image('/img/img1.jpg', 0, 0, width, height);
Ответ 2
Исходя из замечательного ответа @drzaus, у меня были некоторые проблемы, где, если изображение, которое я загружал в Raphael, еще не было в кеше, высота и ширина будут равны 0. Чтобы исправить это:
(function(Raphael){
/// Plugin - replaces original RaphaelJS .image constructor
/// with one that respects original dimensions.
/// Optional overrides for each dimension.
/// @drzaus @zaus
/// based on http://stackoverflow.com/questions/10802702/raphael-js-image-with-its-original-width-and-height-size
/// modified 13/08/2013 by @Huniku to support asynchronous loads
var originalRaphaelImageFn = Raphael.fn.image;
Raphael.fn.imageAsync = function(url, x, y, w, h) {
var dfd = new jQuery.Deferred();
var done = false;
var paper = this;
// fix the image dimensions to match original scale unless otherwise provided
if( !w || !h ) {
//Create the new image and set the onload event to call
//the original paper.image function with the desired dimensions
var img = new Image();
img.onload = function() {
if(done)
return;
if( !w ) w = img.width;
if( !h ) h = img.height;
dfd.resolve(originalRaphaelImageFn.call(paper, url, x, y, w, h));
};
//Begin loading of the image
img.src = url;
//If the images is already loaded (i.e. it was in the local cache)
//img.onload will not fire, so call paper.image here.
//Set done to ensure img.onload does not fire.
if(img.width != 0) {
if( !w ) w = img.width;
if( !h ) h = img.height;
done = true;
dfd.resolve(originalRaphaelImageFn.call(paper, url, x, y, w, h));
}
}
else
dfd.resolve(originalRaphaelImageFn.call(paper, url, x, y, w, h));
return dfd.promise();
};
})(Raphael);
Это позволяет загружать изображение перед его запросом на ширину/высоту, а также поддерживает экземпляр, в котором изображение уже находится в кеше, и событие onload не запускается. Чтобы использовать это, просто:
var dfd = paper.imageAsync("images/hello.png",0,0,false,false);
dfd.done(function( result ) { //result is a Raphael element
console.log('done');
//do something with result
});
Ответ 3
Была та же проблема, спасибо за подсказку - вот плагин для замены существующей функции изображения на тот, который учитывает размеры: http://jsfiddle.net/drzaus/dhkh7/
Чтобы быть более безопасным, вероятно, не следует перезаписывать исходную функцию изображения на случай, если она когда-либо изменится, но вы получите эту идею.
;(function(Raphael){
/// Plugin - replaces original RaphaelJS .image constructor
/// with one that respects original dimensions.
/// Optional overrides for each dimension.
/// @drzaus @zaus
/// based on http://stackoverflow.com/questions/10802702/raphael-js-image-with-its-original-width-and-height-size
var originalRaphaelImageFn = Raphael.fn.image;
Raphael.fn.image = function(url, x, y, w, h) {
// fix the image dimensions to match original scale unless otherwise provided
if( !w || !h ) {
var img = new Image();
img.src = url;
if( !w ) w = img.width;
if( !h ) h = img.height;
}
return originalRaphaelImageFn.call(this, url, x, y, w, h);
};
})(Raphael);
И использование:
window.onload = function() {
var paper = new Raphael('canvas', '100%', '100%');
// specify dimensions as before
paper.image('http://www.stockfreeimages.com/Swiss-panorama-thumb6499792.jpg', 10, 10, 100, 50).attr('stroke', '#000');
// original ratio
paper.image('http://www.stockfreeimages.com/Swiss-panorama-thumb6499792.jpg', 10, 100).attr('stroke', '#f00');
// specify width, height taken from original
paper.image('http://www.stockfreeimages.com/Swiss-panorama-thumb6499792.jpg', 10, 200, 100).attr('stroke', '#0f0');
// specify height, width taken from original
paper.image('http://www.stockfreeimages.com/Swiss-panorama-thumb6499792.jpg', 10, 300, false, 100).attr('stroke', '#00f');
};
Ответ 4
Комментарий Эдварда работал у меня, но мне пришлось поместить его в функцию интервалов и подождать, пока ширина и высота не будут определены до добавления изображения (в противном случае я получил 0x0 изображение). Вот код, который я использовал:
var imgURL = "/img/img1.jpg"
var myImg = new Image();
myImg.src = imgURL;
function loadImagAfterWidthAndHeightAreDefined(){
width = myImg.width;
height = myImg.height;
if(myImg.width > 0 && myImg.height > 0){
image_1 = paper.image(imgURL, 0, 0, width, height);
}
else{
setTimeout(function(){
loadImagAfterWidthAndHeightAreDefined();
},250);
}
}
loadImagAfterWidthAndHeightAreDefined()