如何计算Facebook图形api覆盖offset_y到像素?

时间:2012-05-01 05:00:00

标签: javascript css facebook facebook-graph-api

我可以从图表api中检索facebook封面源和offset_y,例如 -

https://graph.facebook.com/Inna

我明白了 -

"cover": {
      "cover_id": "10151356812150381",
      "source": "http://sphotos.xx.fbcdn.net/hphotos-snc7/s720x720/419277_10151356812150381_302056140380_23114100_97822830_n.jpg",
      "offset_y": 54
   }

但是当我查看实际的facebook页面时,我看到顶部偏移是-135px。 这是如何计算的54?

我想在我的网站上显示有人封面照片,与Facebook的偏移量相同。所以我基本上在做 -

<div class="ed-cover">
            <img src=""/>
    </div>

CSS -

.ed .ed-cover
{
    height:315px;
    overflow:hidden;
    position:relative;
}

.ed .ed-cover img
{
    width:100%;
    position:absolute;    
}

JS -

FB.api(artist, function (data) {
                        $('.ed-cover img').attr('src', data.cover.source).css("top", -1 * data.cover.offset_y);
                    });

但是这里“top”属性的CSS偏移是不正确的,因为我回到了54并且实际偏移是-135px;

6 个答案:

答案 0 :(得分:8)

这真的对你有用吗?我已经用许多图像(横向和纵向)测试了它,如果使用%,则位置总是略有不同。这对我有用:

$.fn.positionate_cover = function (offset_y) {
    var cover_w = 850;
    var cover_h = 315;
    var img_w = $(this).width ();
    var img_h = $(this).height ();
    var real_img_h = (cover_w * img_h / img_w) - cover_h;

    $(this).css ({ top: parseInt (real_img_h * offset_y / 100 * -1) + "px" });
};

$(".ed-cover img")
    .attr ("src", data.cover.source)
    .positionate_cover (data.cover.offset_y)
;

答案 1 :(得分:5)

是的,我实际上自己找到了答案。 facebook发送的偏移量是百分比!

以下工作完美 -

    FB.api(artist, function (data) {
                            $('.ed-cover img').attr('src', data.cover.source)
.css("top", (-1 * data.cover.offset_y) + '%');
                        });

答案 2 :(得分:2)

我在网上找到了这个jquery插件。该插件使用正确的偏移

正确获取图片

这是链接http://restyr.com/getting-facebook-cover-photo-with-offset-y-using-fbgetcover-jquery-plugin/

它看起来像使用偏移量百分比

答案 3 :(得分:1)

MoXplod,你确定吗?

根据我的经验,偏移量是图像不可见部分的百分比(也就是不适合窗口的部分)。

例如: offset = 51 facebook封面照片尺寸(网页)= 851X315 缩放图像大小= 851X1135 顶部= -420px。

所以top = 51%*(1135-315)。

我尝试过很多不同尺寸的不同封面照片。

答案 4 :(得分:0)

如果您只设置Facebook API返回的负百分比偏移量,则可能在80%的情况下有效。然而,获得100%正确位置的唯一方法是使用Claudios解决方案。

答案 5 :(得分:0)

php上的一些解决方案我正在使用PhpThumb_Factory:

        private $_cropX = 850;
        private $_cropY = 315;
        private $_origignalHeight;
        private $_origignalWidth;

 $scale = $this->caclScale($cover->cover->source);
        $thumb = \PhpThumb_Factory::create($imagePath);

                            $real_img_y = ($this->_cropX * $this->_origignalHeight / $this->_origignalWidth) - $this->_cropY;

                            $real_img_x = ($this->_cropY * $this->_origignalWidth / $this->_origignalHeight) - $this->_cropX;

                            $offset = $this->_authSession->offset;


                            $offset_x=($real_img_x * $offset['x'] / 100);



                            $offset_y=($real_img_y * $offset['y'] / 100);

                            $thumb->crop($offset_x, $offset_y, $this->_cropX, $this->_cropY);

                            $thumb->save($imagePath);


    private function caclScale($url) {
            $originalFileSizeParams = @exif_read_data($url);
    //            //$originalFileSize = $originalFileSizeParams['FileSize'];
    //            Zend_Debug::dump($originalFileSizeParams);
    //            die();

            $this->_origignalHeight = $originalFileSizeParams['COMPUTED']['Height'];
            $this->_origignalWidth = $originalFileSizeParams['COMPUTED']['Width'];

            if ($this->_origignalWidth < $this->_cropX) {
                $scale = ($this->_cropX * 100) / $this->_origignalWidth;
            } else {
                $scale = 100;
            }
            return $scale;
        }