FabricJS HiDPI getImageData - PullRequest
       25

FabricJS HiDPI getImageData

0 голосов
/ 13 декабря 2018

Я все еще собираю кусочки, необходимые для понимания редактора печати web 2 в HTML5.Я использую FabricJS и кучу других сторонних инструментов, чтобы сделать это возможным.

Мой последний контрольно-пропускной пункт - это мой Samsung Chromebook Pro с дисплеем HiDPI / Retina.window.devicePixelRatio отличается, и я пытаюсь выяснить, как справиться с этим более высоким DPI, используя FabricJS.Я следовал тому, что все остальные говорили, успешно, но, похоже, это не работает и не помогает мне.Кроме того, мой холст становится очень большим, и объекты больше не могут быть перемещены.

Я также использую другую стороннюю библиотеку, PetitoJPEG , которую я использую для кодирования необработанных данных пикселей изТкань JS холст.Из-за отличия devicePixelRatio от моего другого ноутбука, запуск кодера приводит к тому, что красная точка на правой стороне холста не отображается на пробном изображении.

Мне интересно, как я могу кодировать всеCanvas на дисплее HiDPI.

Из-за всех сторонних ресурсов я хочу предоставить прямую ссылку вместо JSFiddle: http://xbit.x10host.com/editor2.php

Мне кажется, я понимаю, что такое масштабированиеЛюди говорят, что метод успешен, но мне интересно, не работает ли он должным образом из-за моего CSS-преобразования в контейнере canvas.Я пытался настроить масштабирование и ширину / высоту холста и ширину / высоту CSS через консоль, но безрезультатно.

Любая помощь будет принята с благодарностью.Я вставлю фрагмент, который, как все говорят, работает ниже.

Примечание. Мой Samsung Chromebook Pro записывает записанные 26562 байта, а мой ноутбук Lenovo x230 с Windows регистрирует 27586 байтов.

if( window.devicePixelRatio !== 1 ){

  var c = canvas.getElement(); // canvas = fabric.Canvas
  var w = c.width, h = c.height;

// Scale the canvas up by two for retina
// just like for an image
  c.setAttribute('width', w*window.devicePixelRatio);
  c.setAttribute('height', h*window.devicePixelRatio);

// then use css to bring it back to regular size
// or set it here
   c.setAttribute('style', 'width="'+w+'"; height="'+h+'";')
// or jQuery  $(c).css('width', w);
//      $(c).css('width', w);
//      $(c).css('height', h);

  // finally set the scale of the context
  c.getContext('2d').scale(window.devicePixelRatio, window.devicePixelRatio);

     canvas.renderAll();
}

Я знаю, что приведенный выше фрагмент кода работает для большинства людей, но разве следующая строка неверна?

c.setAttribute('style', 'width="'+w+'"; height="'+h+'";')

Это не то, как вы определяете встроенные стили.Вам нужно ":" вместо "=", и здесь нет единицы измерения, поэтому мне интересно, как это работает.

Вот скриншот новой страницы изоляции, которую я создал, чтобы более эффективно изолироватьпроблема: New Isolation Page И вот прямой URL: http://xbit.x10host.com/isolation.php

Вы можете видеть, как использование метода, который все остальные говорят, работает, не работает.Значения свойства CSS недопустимы.Может быть, я просто запутался, но даже если я правильно установил ширину и высоту CSS, использую ли я 1125x675 для getImageData или новый 4500x1200?Использование последнего приводит к тому, что пробное изображение становится слишком большим;4500x1200 содержит все данные, которые я хочу, но есть все это черное пространство.Ниже приведен скриншот этого результата. enter image description here

Теперь 2250x1350 (вывод с использованием метода goto с правильным встроенным CSS-синтаксисом) кажется правильным, но я думал, что исправление canvasдолжен был помочь вывести так же, как мой другой ноутбук.Означает ли это, что люди с дисплеями HiDPI получат более качественные пробные изображения (и отпечатки), чем люди, у которых нет дисплея HiDPI?Я хочу, чтобы размеры и количество пикселей были одинаковыми независимо от DPI устройства.

1 Ответ

0 голосов
/ 15 декабря 2018

Я узнал, как сделать изображения с одинаковым количеством пикселей независимо от DPI.

Это включает использование закадрового холста и повторное рисование на нем холста на желаемой ширине.и высоту, и перекодировать закадровый холст с разрешением 300 точек на дюйм, чтобы независимо от разрешения экрана выходной файл всегда был одинаковым.

...