FabricJS HiDPI getImageData

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

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

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

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

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

Я думаю, что понимаю, что метод масштабирования, о котором говорят люди, является успешным, но мне интересно, работает ли он должным образом из-за моего преобразования CSS в контейнере холста. Я пытался настроить масштабирование и ширину/высоту холста и ширину/высоту 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+'";')

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

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

Вы можете видеть, как использование метода, о котором все говорят, что он работает, на самом деле не работает. Недопустимые значения свойства CSS. Может быть, я просто запутался, но даже если я правильно установлю ширину и высоту CSS, я использую 1125x675 для getImageData или новые 4500x1200? Использование последнего приводит к тому, что пробное изображение становится слишком большим; 4500x1200 содержит все данные, которые я хочу, но затем есть все это черное пространство. Ниже приведен снимок экрана с этим результатом. .com/VPA5e.png" alt="введите здесь описание изображения">

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


person Rick Yoder    schedule 13.12.2018    source источник
comment
Какое поведение вы наблюдаете при использовании фрагмента, которым поделились? Кроме того, какое преобразование CSS в контейнере холста у вас есть? (если вы не говорите об установке высоты/ширины CSS во фрагменте) FWIW, этот код, который вы разместили, верен и является стандартным способом решения этой проблемы; проблема скорее всего в другом.   -  person Matt Mokary    schedule 13.12.2018
comment
Ага. Оставайтесь с нами на самом деле. Я собираюсь начать новую страницу с нуля и попытаться еще немного изолировать проблему.   -  person Rick Yoder    schedule 14.12.2018
comment
Я обновил вопрос. У меня есть пригодный для использования вывод, но мне интересно, могу ли я иметь один и тот же пиксель вывода изображения для пикселя на дисплеях HiDPI и не HiDPI.   -  person Rick Yoder    schedule 14.12.2018


Ответы (1)


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

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

person Rick Yoder    schedule 15.12.2018