Ver Mensaje Individual
  #2 (permalink)  
Antiguo 13/06/2015, 11:05
Avatar de Nemutagk
Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 7 meses
Puntos: 406
Respuesta: Calcular coordenadas sobre imagen redimencionada

Después de despejarme y aclarar ideas me di cuenta que estaba completamente mal planteado, no debía obtener el porcentaje de reducción de la imagen reedimencionada con respecto a la original, lo que tenia que hacer es calcular cual es el porcentaje de coordenadas referente a la imagen, por ejemplo, si tengo una posición (top: 10px left:255px) sobre una imagen que mide (width: 1200 height: 650) tendría los siguientes porcentajes (top: 1.538461538461538% left: 21.25%), ojo, que son importantes todos los decimales para tener la mayor precisión posible, entonces tendría que calcular la misma posición en la original usando los porcentajes de la miniatura, para que se entienda mejor dejo el código que generé en un archivo de pruebas

HTML
Código HTML:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="en">
  3.     <meta charset="UTF-8">
  4.     <title>Document</title>
  5.     <link rel="stylesheet" href="jquery-ui.min.css">
  6.     <link rel="stylesheet" href="imagenes.css">
  7.     <script src="jquery-2.1.3.min.js"></script>
  8.     <script src="jquery-ui.min.js"></script>
  9.     <script src="imagen.js"></script>
  10. </head>
  11. <div class="block-preview">
  12.     <img id="img-preview" src="imagen.jpg" alt="">
  13.     <div class="div-cut"></div>
  14. </div>
  15. <div class="block-info">
  16.     <p>coordenadas preview: <input type="text" id="coord-prev"></p>
  17.     <p>coordenadas original: <input type="text" id="coord-org"></p>
  18.     <p>tamaño del recuadro: <input type="text" id="size-cut"></p>
  19. </div>
  20. <div class="block-org">
  21.     <img id="img-org" src="imagen.jpg" alt="">
  22.     <div class="div-cut"></div>
  23. </div>
  24. </body>
  25. </html>

Javascript
Código Java:
Ver original
  1. $(document).on('ready',function() {
  2.  
  3.     //posicionamos el primer bloque
  4.     var offset = $('#img-preview').offset();
  5.     console.log('offset view x:'+offset.top+' y:'+offset.left);
  6.     $('.block-preview .div-cut').offset({"top":offset.top,"left":offset.left});
  7.  
  8.     var position = $('#img-preview').position();
  9.     console.log('position view x:'+position.top+' y:'+position.left);
  10.     $('#coord-prev').val('x:'+position.top+' y:'+position.left);
  11.  
  12.     //posicionamos el segundo bloque
  13.     var offsetOrg = $('#img-org').offset();
  14.     console.log('offset org x:'+offsetOrg.top+' y:'+offsetOrg.left);
  15.     $('.block-org .div-cut').offset({"top":offsetOrg.top,"left":offsetOrg.left});
  16.  
  17.     var positionOrg = $('#img-org').position();
  18.     $('#coord-org').val('x:'+positionOrg.top+' y:'+positionOrg.left);
  19.  
  20.     var posX, posY;
  21.  
  22.     //tamaño de crop
  23.     var porSizeCut = (($('.block-preview .div-cut').width() * 100) / $('#img-preview').width());
  24.     setSizeCrop(porSizeCut);
  25.  
  26.     $('.block-preview .div-cut').draggable({
  27.         containment: $('#img-preview'),
  28.         stop: function(event,ui) {
  29.             posX = ui.position.top - position.top;
  30.             posY =  ui.position.left - position.left;
  31.  
  32.             posX = ui.position.top;
  33.             posY = ui.position.left;
  34.  
  35.             setCoords(posX,posY);
  36.         }
  37.     }).resizable({
  38.         aspectRatio: true,
  39.         maxWidth: $('#img-preview').width(),
  40.         maxHeight: $('#img-preview').height(),
  41.         stop: function(event, ui) {
  42.             console.log('new size cut '+ui.size.width);
  43.             porSizeCut = ((ui.size.width * 100) / $('#img-preview').width());
  44.             setSizeCrop(porSizeCut);
  45.         }
  46.     });
  47. });
  48.  
  49. function setCoords(arriba,derecha) {
  50.     //fix padding
  51.     arriba = arriba - 5;
  52.     derecha = derecha - 5;
  53.     $('#coord-prev').val('arriba: '+arriba+' derecha: '+derecha);
  54.     //porcentajes de view
  55.     var widthView = $('#img-preview').width();
  56.     var heightView = $('#img-preview').height();
  57.     console.log('size ancho: '+widthView+' alto:'+heightView);
  58.  
  59.     var porViewAncho = 100 - (derecha * 100) / widthView;
  60.     var porViewAlto = 100 - (arriba * 100) / heightView;
  61.     console.log('por view ancho:'+porViewAncho+' alto:'+porViewAlto);
  62.  
  63.     //porcentajes orig
  64.     var inputImg = document.getElementById('img-org');
  65.     var widthOrg = inputImg.naturalWidth;
  66.     var heightOrg = inputImg.naturalHeight;
  67.     console.log('size ancho: '+widthOrg+' alto'+heightOrg);
  68.  
  69.     var porOrgAncho = widthOrg - ((widthOrg * porViewAncho) / 100);
  70.     var porOrgAlto = heightOrg - ((heightOrg * porViewAlto) / 100);
  71.     console.log('coord org ancho:'+porOrgAncho+' alto:'+porOrgAlto);
  72.  
  73.     $('#coord-org').val('arriba: '+porOrgAlto+' derecha: '+porOrgAncho);
  74.     $('.block-org .div-cut').css({"top":porOrgAlto,"left":porOrgAncho});
  75. }
  76.  
  77. function setSizeCrop(size) {
  78.     console.log('cut view por '+size);
  79.     var porOrg = 10;
  80.  
  81.     var inputImg = document.getElementById('img-org');
  82.     var widthOrg = inputImg.naturalWidth;
  83.  
  84.     var size = ((widthOrg * size) / 100) + 'px';
  85.     $('#size-cut').val(size);
  86.     $('.block-org .div-cut').css({"width":size,"height":size});
  87. }

CSS
Código CSS:
Ver original
  1. body .block-preview {
  2.     width: 700px;
  3.     border: solid 1px #C2C2C2;
  4.     padding: 5px;
  5.     position: relative;
  6.     overflow: auto;
  7.     float: left;
  8. }
  9.  
  10. body .block-preview img {
  11.     width: 400px;
  12. }
  13.  
  14. body .block-info {
  15.     width: 619px;
  16.     text-align: right;
  17.     border: solid 1px #C2C2C2;
  18.     float: right;
  19. }
  20.  
  21. body .block-info input {
  22.     width: 450px;
  23.     padding: 5px;
  24. }
  25.  
  26. body .block-preview .div-cut {
  27.     width: 160px;
  28.     height: 160px;
  29.     border: solid 1px #FF0000;
  30.     position: absolute;
  31.     top: 0px;
  32.     left: 0px;
  33. }
  34.  
  35. body .block-org {
  36.     border: solid 1px #C2C2C2;
  37.     margin: 10px 0px 0px 0px;
  38.     padding: 5px;
  39.     position: relative;
  40.     clear: both;
  41.     overflow: auto;
  42. }
  43.  
  44. body .block-org .div-cut {
  45.     width: 240px;
  46.     height: 240px;
  47.     border: solid 1px #FF0000;
  48.     position: absolute;
  49.     top: 0px;
  50.     left: 0px;
  51. }

Solo, ojo, la imagen original debe mostrarse en su tamaño original, sin ser redimencionada por css o por el contenedor de la imagen, si no, la posición del recuadro rojo no será correcta

Actualización: eh incluido los cálculos para determinar el tamaño del recuadro rojo coincida en ambas imagenes
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)

Última edición por Nemutagk; 13/06/2015 a las 12:25 Razón: eh incluido los cálculos para determinar el tamaño del recuadro rojo coincida en ambas imagenes