За последние 24 часа нас посетили 17640 программистов и 1669 роботов. Сейчас ищут 1628 программистов ...

Библиотеки для работы с изображениями

Тема в разделе "JavaScript и AJAX", создана пользователем Алекс8, 30 сен 2017.

  1. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    В общем помогите мне пожалуйста)) я нифига не фрондэндщик - но стоит такая задача.
    Нужно сделать что то типа редактора, что бы загрузив картинку можно было ее кадрировать, выбрать шрифт, нанести надпись, увеличить уменьшить размер шрифта, перетянуть надпись куда то....
    насколько я понимаю что это все делается с помощью canvas... но знаний пока мало в этой области.
    Так что подскажите - помогите)
    Спасибо.
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @Алекс8, с перечисленным функционалом, вы вряд ли найдете бесплатный плагин. А так, есть неплохой Pixie Image Editor
     
    Алекс8 и Fell-x27 нравится это.
  3. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Подсказать что конкретно?
     
    Алекс8 нравится это.
  4. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    может есть какие то opensource проекты.. может кто то что то подобное видел на гитхабе..
    или может гдето примеры есть как это реализовывается..
    я особо не сильно понимаю даже с чего начинать если самому это делать..
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
  6. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    @Fell-x27 да)) я тоже читаю сижу с самого начала)
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Как то и мне приходилось, для своего велосипеда делать что-то подобное, использовал canvas)
    --- Добавлено ---
    Код (Javascript):
    1. var intup_field = document.getElementById('add_file');
    2.                 console.log(intup_field);
    3.                 // from an input element
    4.                 var filesToUpload = intup_field.files;
    5.                 // from drag-and-drop
    6.                 var canvasDiv = document.getElementById('can');
    7.  
    8.                 canvasDiv.style.width = "100%";
    9.                 var MAX_WIDTH = 900;
    10.                 var MAX_HEIGHT = 900;
    11.                 var angles = [0 * Math.PI, 0.5 * Math.PI, Math.PI, 1.5 * Math.PI],
    12.                         index = 0;
    13.                 var width;
    14.                 var height;
    15.  
    16.                 intup_field.ondrag = intup_field.onchange = function () {
    17.                     console.log(intup_field.files);
    18.  
    19.                     for (var i = 0; i < intup_field.files.length; i++) {
    20.  
    21.  
    22.                         var file = intup_field.files[i];
    23.                         var img = document.createElement("img");
    24.                         img.src = window.URL.createObjectURL(file);
    25.                         //console.log(i);
    26.                         img.onload = function () {
    27.                             //console.log(img);
    28.  
    29.                             var panel_group = document.createElement('div');
    30.                             panel_group.className = 'panel-group';
    31.                             var panel = document.createElement('div');
    32.                             var panel_heading = document.createElement('div');
    33.                             panel_heading.className = 'panel-heading';
    34.                             panel.className = 'panel panel-default';
    35.                             var panel_body = document.createElement('div');
    36.                             panel_body.className = 'panel-body';
    37.                             panel.appendChild(panel_heading);
    38.                             panel.appendChild(panel_body);
    39.                             panel_group.appendChild(panel);
    40.  
    41.                             var canvas = document.createElement('canvas');
    42.                             var ctx = canvas.getContext("2d");
    43.                             var buttonsLeft = document.createElement('div');
    44.                             var buttonsRight = document.createElement('div');
    45.  
    46.  
    47.  
    48.                             var right = document.createElement('button');
    49.                             right.type = 'button';
    50.                             right.className = 'btn btn-default';
    51.                             var sp = document.createElement('span');
    52.                             sp.className = 'glyphicon glyphicon-chevron-right';
    53.                             right.appendChild(sp);
    54.  
    55.                             right.onclick = function () {
    56.  
    57.                                 setSize(img);
    58.                                 index++;      /// decrement index of array
    59.                                 if (index >= angles.length)
    60.                                     index = 0;
    61.                                 //alert(index);
    62.                                 resizeConv(canvas);
    63.  
    64.                                 var angle = angles[index],
    65.                                         cw = canvas.width * 0.5,
    66.                                         ch = canvas.height * 0.5;
    67.                                 ctx.translate(cw, ch);
    68.                                 ctx.rotate(angle);
    69.                                 ctx.translate(-width * 0.5, -height * 0.5);
    70.                                 ctx.drawImage(img, 0, 0, width, height);
    71.                                 ctx.setTransform(1, 0, 0, 1, 0, 0);
    72.                                 //console.log(ctx);
    73.                                 return false;
    74.                             };
    75.  
    76.                             var left = document.createElement('button');
    77.                             left.type = 'button';
    78.                             left.className = 'btn btn-default';
    79.                             var sp = document.createElement('span');
    80.                             sp.className = 'glyphicon glyphicon-chevron-left';
    81.                             left.appendChild(sp);
    82.                             left.onclick = function () {
    83.  
    84.                                 setSize(img);
    85.                                 index--;      /// decrement index of array
    86.                                 if (index < 0)
    87.                                     index = angles.length - 1;
    88.  
    89.                                 resizeConv(canvas);
    90.                                 var angle = angles[index],
    91.                                         cw = canvas.width * 0.5,
    92.                                         ch = canvas.height * 0.5;
    93.                                 ctx.translate(cw, ch);
    94.                                 ctx.rotate(angle);
    95.                                 ctx.translate(-width * 0.5, -height * 0.5);
    96.                                 ctx.drawImage(img, 0, 0, width, height);
    97.                                 ctx.setTransform(1, 0, 0, 1, 0, 0);
    98.                                 console.log();
    99.                                 return false;
    100.                             };
    101.                             var del = document.createElement('button');
    102.                             del.type = 'button';
    103.                             del.className = 'btn btn-default';
    104.                             var sp = document.createElement('span');
    105.                             sp.className = 'glyphicon glyphicon-remove ';
    106.                             del.appendChild(sp);
    107.                             del.onclick = function () {
    108.                                 canvasDiv.removeChild(panel_group);
    109.                             };
    110.                             //left.innerHTML = 'left';
    111.  
    112.                             //right.innerHTML = 'right';
    113.                             buttonsLeft.className = 'btn-group btn-group-sm';
    114.                             buttonsLeft.appendChild(left);
    115.                             buttonsLeft.appendChild(right);
    116.                             buttonsRight.className = 'btn-group btn-group-sm';
    117.                             buttonsRight.appendChild(del);
    118.  
    119.                             panel_body.appendChild(canvas);
    120.                             panel_heading.appendChild(buttonsLeft);
    121.                             panel_heading.appendChild(buttonsRight);
    122.                             canvasDiv.appendChild(panel_group);
    123.                             setSize(this);
    124.                             canvas.width = width;
    125.                             canvas.height = height;
    126.  
    127.                             ctx.drawImage(this, 0, 0, width, height);
    128.                         };
    129.  
    130.  
    131.                     }
    132.  
    133.  
    134.                 };
    135.                 function setSize(img) {
    136.                     if (MAX_WIDTH !== 0 || MAX_HEIGHT !== 0) {
    137.                         width = img.width;
    138.                         height = img.height;
    139.  
    140.                         if (width > height) {
    141.                             if (width > MAX_WIDTH) {
    142.                                 height *= MAX_WIDTH / width;
    143.                                 width = MAX_WIDTH;
    144.                             }
    145.                         } else {
    146.                             if (height > MAX_HEIGHT) {
    147.                                 width *= MAX_HEIGHT / height;
    148.                                 height = MAX_HEIGHT;
    149.                             }
    150.                         }
    151.                     } else {
    152.                         width = img.width;
    153.                         height = img.height;
    154.                     }
    155.                 }
    156.  
    157.                 function resizeConv(canvas) {
    158.                     //canvas.height = height;
    159.  
    160.                     switch (index) {
    161.                         case 0:
    162.                         case 2:
    163.                             /// for 0 and 180 degrees size = image
    164.                             canvas.width = width;
    165.                             canvas.height = height;
    166.                             break;
    167.                         case 1:
    168.                         case 3:
    169.                             /// for 90 and 270 canvas width = img height etc.
    170.                             canvas.width = height;
    171.                             canvas.height = width;
    172.                             break;
    173.                     }
    174.                 }
    175.                 names.oninput = function () {
    176.                     console.log(this);
    177.                     if (this.textLength > 4) {
    178.                         this.parentElement.classList.remove("has-error");
    179.                     }
    180.                 };
    181.                
    182.                 add_product_button.onclick = function () {
    183.  
    184.                     var canv = document.getElementsByTagName("canvas");
    185.                     var formData = new FormData();
    186.  
    187.                     for (j = 0; j < add_product.length; j++) {
    188.                         //alert(add_product[j].value);
    189.                         if (add_product[j].value === '') {
    190.                             d = add_product[j].parentElement;
    191.                             d.classList.add("has-error");
    192.                         } else {
    193.                             formData.append(add_product[j].name, add_product[j].value);
    194.                         }
    195.                     }
    196.                     for (i = 0; i < canv.length; i++) {
    197.                         //console.log(canv[i].toDataURL('image/jpeg'));
    198.                         formData.append("image[]", canv[i].toDataURL('image/jpeg'));
    199.                     }
    200.                     var xhr = new XMLHttpRequest();
    201.                     xhr.open("POST", "http://newstart/?cmd=Test");
    202.                     xhr.send(formData);
    203.  
    204.                     console.log(xhr.responseText);
    205.  
    206.                 };
    207.  
    208.  
    209.                

    В качестве старта, вероятно чем то поможет, но не более)).
    Этот код делает:
    1. загружается фото, и отображается на странице. Можно его крутить- вертеть и наконец удалять! Все.

    :) надеюсь чем-то помог.
     
    Алекс8 нравится это.
  8. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    о да))) от чего то отталкиваться можно)) спасибо))
    плюс почитаю то что выше ребята дали)) можно будет что то сделать..
    я вообще фронтом крайне мало занимался..
    Спасибо)
     
  9. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Про мозиллу тоже не забывай, я там тусовался))
     
    Fell-x27 и Алекс8 нравится это.
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    ну input же :)
     
    mahmuzar нравится это.
  11. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Fell-x27, емае, у меня часто такое, быстро печатаешь, палец опережает другой. А дальще дело автокомплита, и переменная везде такая какой ее вначале объявил))