Почему Jcrop-трекер не показывает правильное положение?

В моем приложении пользователи могут сделать снимок или загрузить изображение со своего устройства. Это изображение является источником для функции Jcrop. Эта функция работает корректно, так как в ней правильно "обрезается". Однако jcrop-трекер, который предварительно просматривает то, что вы обрезаете, не показывает его правильное положение на изображении.

Пожалуйста, посмотрите этот пример:

http://piclair.com/data/64u15.jpg

При перемещении трекера в верхнюю часть изображения будет отображаться почти все изображение. При движении вниз он вообще ничего не покажет. Как это возможно?

Я предполагаю, что это связано с тем, что jCrop имеет проблемы с уменьшенными изображениями (например, изображениями, сделанными с камеры устройства).

Я использую CSS для уменьшения изображения, чтобы оно поместилось на экране устройства:

#imgContainer {
    max-width: 100%;
    max-height: 100%;
}
#imgContainer img {
    max-width: 100%;
    max-height: 100%;
}

Есть ли способ предотвратить это?

Вот мой код:

$(window).load(function() {

var jcrop_api, boundx, boundy;

function updatePreview(c) { // croping image preview
    if (parseInt(c.w) > 0) {
        var rx = 220 / c.w, ry = 220 / c.h;
    }
}
function showCoords(c) { // show all coords
    $('#x').val(c.x);
    $('#y').val(c.y);
    $('#x2').val(c.x2);
    $('#y2').val(c.y2);
    $('#w').val(c.w);
    $('#h').val(c.h);
}

$('#cropImage').Jcrop({
    onChange: updatePreview,
    onSelect: showCoords,
    bgFade: true,
    bgOpacity: .8,
    aspectRatio: 1,
    maxSize: [ 150, 150 ],
    boxWidth: 284,
    boxHeight: 382
},function(){
    jcrop_api = this;
});
var canvas = document.getElementById("canvasresult");
$("#m1-cropScreen-cropIt").on("click", function(){

    var context = canvas.getContext("2d");
    var img = document.getElementById("cropImage"),
        $img = $(img),
        imgW = img.naturalWidth,
        imgH = img.naturalHeight;

    console.log($img.width());
    console.log($img.height());

    var ratioY = imgH / $img.height(),
        ratioX = imgW / $img.width();

    var getX = $('#x').val() * ratioX,
        getY = $('#y').val() * ratioY,
        getWidth = $('#w').val() * ratioX,
        getHeight = $('#h').val() * ratioY;

    context.drawImage(img,getX,getY,getWidth,getHeight,0,0,150,150);

    $('#cropResult').attr('src', canvas.toDataURL());

});

});

person Forza    schedule 13.03.2014    source источник
comment
Можете ли вы опубликовать что-то, что мы можем протестировать напрямую? (Мне не хватает какого-то источника html, поэтому скрипка или что-то в этом роде было бы удобно)   -  person Veda    schedule 20.03.2014
comment
Я предполагаю, что ваша проблема связана с тем, что вы не используете правильные размеры изображения, соответственно, не переносите их на фактический размер экрана / дисплея! Кроме того, использование max-height: 100% может привести к изменению соотношения сторон изображения (когда высота изображения превышает высоту области просмотра при ширине 100%). Я думаю, вам нужно преобразовать ширину и высоту изображения в соответствии с шириной области просмотра, выполнить обрезку и преобразовать обрезку обратно в исходный размер изображения.   -  person Netsurfer    schedule 21.03.2014
comment
Хм, вы могли бы иметь точку здесь. Любая идея, как я могу преобразовать изображение в размер ширины окна просмотра?   -  person Forza    schedule 21.03.2014
comment
Можете также включить свой HTML в вопрос?   -  person Ben Smith    schedule 22.03.2014
comment
Я считаю 12 элементов DOM, упомянутых здесь, без предоставления DOM. Невозможно отладить этот код без HTML, поскольку он, скорее всего, связан с макетом вашей страницы.   -  person David H. Bennett    schedule 27.03.2014
comment
Спасибо всем, кто ответил на этот вопрос. Пожалуйста, смотрите мой ответ ниже   -  person Forza    schedule 03.04.2014


Ответы (2)


Господа, извините за задержку с ответом вам. Спасибо всем, кто ответил на мой вопрос.

У меня была очень напряженная неделя, поэтому у меня было мало времени для работы над этим проектом. Сегодня снова взял в руки и впервые попробовал решить эту проблему сам еще раз.

К счастью, на этот раз это сработало. В итоге я использовал метод определения размера коробки от Jcrop. Я полагаю, что пробовал это раньше, но на этот раз это работает безупречно. Так проблема решена :)

person Forza    schedule 03.04.2014

К сожалению, это не сработало для меня, но у меня была другая проблема, которая, я надеюсь, поможет всем, у кого есть эта проблема.

Мой был из-за конфликта стилей css.

 From a 3rd party style sheet
 img { max-width: 100% }

  My Style Sheet -- adding this fixed it
 .jcrop-holder img, img.jcrop-preview { max-width: none !important }
person Matthew A Thomas    schedule 22.10.2014