Подтвердить что ты не робот

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);

И так я загружаю оригинальный размер изображения, и этот вопрос решает мою проблему, но.... нет пути внутри Рафаэля, чтобы сделать это???

4b9b3361

Ответ 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()