Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.01.2015, 10:32
Интересующийся
Отправить личное сообщение для assan Посмотреть профиль Найти все сообщения от assan
 
Регистрация: 13.07.2010
Сообщений: 27

Работа с изображением
есть код, который ресайзит картинку, поворачивает
на экране картинка выглядит качественно.
но ..полученная после преобразования в canvas картинка имеет паршивое качество.
как сделать преобразования картинки в webgl?
как сделать скриншот части картинки с экрана?
другие варианты?
Ответить с цитированием
  #2 (permalink)  
Старый 10.01.2015, 02:12
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Дублируете.
Покажите проблему лицом. Нужен запускаемый скрипт с вашими трансформациями, возможно проблема в вашем скрипте а не в канвас.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Ответить с цитированием
  #3 (permalink)  
Старый 10.01.2015, 22:02
Интересующийся
Отправить личное сообщение для assan Посмотреть профиль Найти все сообщения от assan
 
Регистрация: 13.07.2010
Сообщений: 27

код
картинка масштабируется, поворачивается, позиционируется таким образом чтоб нужный её фрагмент был вписан в рамку (70px*70px)
canvas = document.createElement("canvas");
                var context = canvas.getContext("2d");

                var pic = new Image();
                pic.src = $('#img').attr('src');
                var sq = Math.sqrt(crop.width * crop.width + crop.height * crop.height);
                var k = crop.width / crop.height;
                var wc, hc;
                if (k >= 1) {
                    wc = sq;
                    hc = sq / k;
                } else {
                    wc = sq;
                    hc = sq / k;
                }

                var x = new_img.x * pic.width / new_img.width - wc / 2 / img.scale;
                var y = new_img.y * pic.height / new_img.height - hc / 2 / img.scale;
                var w = wc / img.scale;
                var h = hc / img.scale;

                canvas.height = hc;
                canvas.width = wc;
                context.fillStyle = '#ffffff';
                context.fillRect(0, 0, wc, hc);
                context.drawImage(pic, x, y, w, h, 0, 0, wc, hc);
                pic.src = canvas.toDataURL("image/jpeg", 1);
                context.translate(wc / 2, hc / 2);
                context.rotate((img.rotate * Math.PI) / 180);
                context.drawImage(pic, -wc / 2, -hc / 2);
                pic.src = canvas.toDataURL("image/jpeg", 1);
                canvas.height = crop.height;
                canvas.width = crop.width;
                x = (wc - crop.width) / 2;
                y = (hc - crop.height) / 2;

                context.drawImage(pic, x, y, crop.width, crop.height, 0, 0, crop.width, crop.height);
                document.querySelector('.cropped').innerHTML += '<div ><img id="' + crop.id + '" src="' + canvas.toDataURL("image/jpeg", 1) + '"></div>';

картинки с рамкой - скриншоты с экрана, то как выглядит картинка после позиционирования
без рамки - после обрезки canvas
PS
кроссбраузерность не нужна, хром, мозилла(показан результат в хроме)
PSPS
а в мозиле данный код не работает...
для желающих проверить - могу выслать весь код странички.
Изображения:
Тип файла: jpg Захват-1.jpg (3.1 Кб, 34 просмотров)
Тип файла: jpg Захват-2.jpg (3.3 Кб, 30 просмотров)
Тип файла: jpg скачанные файлы.jpg (3.7 Кб, 30 просмотров)
Тип файла: jpg скачанные файлы (4).jpg (3.4 Кб, 36 просмотров)
Тип файла: jpg скачанные файлы (5).jpg (3.0 Кб, 29 просмотров)
Тип файла: jpg скачанные файлы (1).jpg (7.8 Кб, 25 просмотров)

Последний раз редактировалось assan, 11.01.2015 в 00:51.
Ответить с цитированием
  #4 (permalink)  
Старый 11.01.2015, 13:31
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Если ты берёшь растр из маленького канваса, да ещё в Jpeg то результат и вправду будет лажовый.
Давай попробуем обойтись без того чтобы забирать данные из канвас, вместо этого источником данных всегда будет оригинальное изображение.

Берём морду кота вырезаем crop И масштабируем вырезанный результат на весь доступный канвас с поворотом на 90градусов, обрати внимание что в качестве мы не теряем

<b>Зум в канвас. В большой и в маленький</b></br>
<canvas id="myCanvas" width="500" height="500"></canvas>
<canvas id="myCanvas2" width="70" height="70"></canvas>

<br/> <b>original</b><br/>
<img id="test"  src="http://rsm.haber365.com/N/1296202473_22_kedicik-22.jpg">

<script>
     function zoomAndRotate(imageObj,ctx,x,y,width,height){
          ctx.rotate(90 * Math.PI / 180);
          ctx.translate(0,-ctx.canvas.width);

	      ctx.drawImage(imageObj, x, y, width,height,0,0,ctx.canvas.width,ctx.canvas.height); 
          ctx.setTransform(1, 0, 0, 1, 0, 0);
          //return ctx.getImageData(0, 0, width, height);	
      }

      function drawImage(imageObj) {
        //example 1
        var canvas = document.getElementById('myCanvas');
        var context = canvas.getContext('2d');
        var zoomResult=zoomAndRotate(imageObj, context, 160,140,260,250);
 
        //example 2
        var canvas2 = document.getElementById('myCanvas2');
        var context2 = canvas2.getContext('2d');
        var zoomResult2=zoomAndRotate(imageObj, context2, 160,140,260,250);

      }
      document.getElementById('test').onload=function(){
           drawImage(this);
      }

</script>


Если нужно вырезать часть из вырезанной картинки то нужно вновь брать растр из оригинальной картинки но не в коем случае не из канваса в который масштабировал иначе будет ужасный результат
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 11.01.2015 в 15:34.
Ответить с цитированием
  #5 (permalink)  
Старый 11.01.2015, 14:36
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Лови второй пример с тремя последовательными увеличениями без обращения к данным в канвасе.
Координаты crop в zoom указываются в процентах тобишь от 0(0%) до 1 (100%).

<b>три зума, каждый последующий увеличивает картинку из предыдущего</b></br>
<canvas id="myCanvas" width="250" height="250"></canvas>
<canvas id="myCanvas2" width="250" height="250"></canvas>
<canvas id="myCanvas3" width="250" height="250"></canvas>

<br/> <b>original</b><br/>
<img id="test"  src="http://rsm.haber365.com/N/1296202473_22_kedicik-22.jpg">

<script>
     function zoom(imageObj,ctx,x,y,width,height,opt){
         opt=opt||{};
         var w=opt.w||imageObj.width;
         var h=opt.h||imageObj.height;
         var offsetX=opt.x||0;
         var offsetY=opt.y||0;

	     ctx.drawImage(imageObj, (x*w)+offsetX, (y*h)+offsetY, width*w,height*h, 0,0,ctx.canvas.width,ctx.canvas.height); 
         ctx.setTransform(1, 0, 0, 1, 0, 0);

         return {
            w:w*width,
            h:h*height,
            x:(x*w)+offsetX,
            y:(y*h)+offsetY
         }
      }


      function drawImage(imageObj) {
        //zoom 1
        var canvas = document.getElementById('myCanvas');
        var context = canvas.getContext('2d');
        var zoomResult=zoom(imageObj, context, 0.2,0.2, 0.5,0.5);
 
        //zoom 2
        var canvas2 = document.getElementById('myCanvas2'); 
        var context2 = canvas2.getContext('2d');
        var zoomResult2=zoom(imageObj, context2,  0.3, 0.33, 0.4,0.4, zoomResult);

 
        //zoom 3
        var canvas3 = document.getElementById('myCanvas3'); 
        var context3 = canvas3.getContext('2d');
        var zoomResult3=zoom(imageObj, context3,  0.1, 0.08, 0.4, 0.4, zoomResult2);
      }

      document.getElementById('test').onload=function(){
           drawImage(this);
      }
</script>
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 11.01.2015 в 15:41.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интересная работа для JavaScript-разработчика в Москве от 120 000 linna9 Работа 1 21.01.2014 23:59
Front-end разработчик, работа удаленная или в офисе(Нижний Новгород), фуллтайм. VadimZharko Работа 8 29.04.2013 09:03
Javascript фронтенд разработчик(долгосрочная, удаленная работа) cpp Работа 11 16.09.2012 12:04
Программист JavaScript постоянная удалённая работа. moisha Работа 4 26.10.2011 19:52
Постоянная работа / Front-end / Москва kooper Работа 4 29.09.2011 22:06