HTML5 Canvas - масштабируемый раздел с предварительным просмотром и различными размерами изображения - PullRequest
0 голосов
/ 03 апреля 2012

У меня сложная проблема, которую нужно решить. Теперь мне нужно написать такую ​​функцию в javascript, которая поддерживает объектную канву в html5, которая будет вырезать часть изображения и показывать ее в предварительном просмотре. Мне нужно сделать, чем с различным разрешением изображений. Для этого я использую библиотеку jQuery, особенно jquery.Jcrop.js. Видимая часть изображения в предварительном просмотре, которую я собираюсь использовать позже для дальнейших целей, должна быть доступна для записи в виде обрезки в файл - поэтому я использую возможности холста. Этот скрипт работает хорошо, но проблема заключается в том, что я пытаюсь масштабировать фотографию от большего к меньшему (я хочу, чтобы каждое изображение было зафиксировано в окне браузера до высоты 500 пикселей). Я представляю ниже текущий рисунок сценария:

 function updatePreview(c)
 {
 if (parseInt(c.w) > 0)
 {
 var rx = 200 / c.w;
 var ry = 300 / c.h;

 // Show canvas image preview2
 var imageObj = $("#target")[0];
 var canvas = $("#preview2")[0];
 var context = canvas.getContext("2d");
 canvas.setAttribute('width', '200');
 canvas.setAttribute('height', '300');
 //context.scale(2, 2);
 context.drawImage(imageObj, c.x, c.y, c.w, c.h, 0, 0, 
 canvas.width, canvas.height);

 $('#preview').css({
 width: Math.round(rx * boundx) + 'px',
 height: Math.round(ry * boundy) + 'px',
 marginLeft: '-' + Math.round(rx * c.x) + 'px',
 marginTop: '-' + Math.round(ry * c.y) + 'px'
 });
 }
 };

А вот упрощенный HTML-код, предназначенный для обработки сценарием

 <table>
 <tr>
 <td>
 <img src="http://imgon.net/di-M7Z9.jpg" id="target" 
 alt="obrazek" height="450"/>
 </td>
 <td>
 <div style="width:200px;height:300px;overflow:hidden;">
 <img src="http://imgon.net/di-M7Z9.jpg" id="preview" alt="Preview" />
 </div>
 <br />
 <div>
 <canvas id="preview2" style="width:200px;height:300px;"></canvas>
 </div>
 </td>
 </tr>
 </table>

Первый предварительный просмотр основан на CSS и работает правильно, но CSS охватывает только часть изображения, а не обрезает его. В отличие от этого, холст видит изображение в высоком разрешении, а предварительный просмотр не отражает сегмент масштабированных изображений (я только увеличил раздел). Это происходит в Firefox. Для Internet Explorer есть специальная библиотека, и там результат для холста такой же, как и для CSS. Мой последний вопрос. Как я могу сказать функции, чтобы создать предварительный просмотр для масштабированного изображения, а не предварительный просмотр для исходного разрешения? Я попытался заменить эту переменную c.y, например, Math.round (rx * boundx) и на cx Math.round (ry * boundy), но это неправильно. Я даю здесь страницу, где вы можете увидеть сценарий в прямом эфире: agd-brita.pl/mobile2/tutorial.html Я прошу вас о помощи. Спасибо за продвижение.

1 Ответ

0 голосов
/ 04 апреля 2012

Мне нужно было немного понять, как работает jCrop, чтобы ответить вам.

Я сделал скрипку, чтобы показать, как работает мое решение: http://jsfiddle.net/maitrekaio/Wre8w/
Суть в том, что работа с CSS и работа с холстом действительно разные, и вам приходится делать разные вычисления.
Тем не менее, начало то же самое: у вас есть элемент изображения target и кадрирование внутри. Детали обрезки даны jCrop, а размеры элемента изображения хранятся в моей переменной displayedImg.

Предварительный просмотр CSS

preview-container походит на окно, которое позволяет нам видеть часть содержащегося изображения. Размер элемента изображения не был изменен, поэтому его размеры соответствуют размерам изображения realImg. Когда размер урожая изменяется и перемещается, мы должны дать ощущение, что окно делает то же самое. Фактически, это изображение, которое изменяется и перемещается. Как это вычислить?
Легко видеть, что отношение (crop / displayImg) должно быть равно отношению (preview / realImg). Это дает нам формулу:
realImg = (displayImg * Предварительный просмотр) / кадрирование
При этом легко вычислить ширину, высоту, x (marginLeft) и y (marginTop), которые применяются к предварительному просмотру CSS.

Предварительный просмотр холста

Для холста мы знаем, что будем использовать самую сложную версию context.drawImage (), которая позволяет нам обрезать и изменять размеры. Первым параметром этого метода является объект изображения JS, мы будем использовать изображение target. На этот раз мы хотим вычислить обрезку на реальном изображении, зная обрезку на отображаемом изображении. (crop / displayImg) должен быть равен (realImgCrop / realImg). Это дает нам формулу: realImgCrop = (обрезать * realImg) / displayImg
Готово!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...