Размер картинки при выводе на принтер

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Размер картинки при выводе на принтер

Сообщение Vlad04 » 06.09.2017 08:50:03

Всем доброго дня.
Столкнулся с таким непонятным явлением: вывожу картинку на принтер, рисую на Canvas принтера, заполняю всю область, но размер информации, отправляемый на принтер различается от способа рисования. Несколько примеров, иллюстрирующих непонятку:
Вариант 1. Вывожу горизонтальные линии случайным цветом с помощью команд MoveTo и LineTo по линиям.
Код: Выделить всё
var
   W, H : integer ;
begin
  with Printer do
  begin
    BeginDoc;
      randomize ;
      for H := 1 to PageHeight-1 do
      begin
        Canvas.Pen.Color := random(High(TColor-1)) ;
        Canvas.MoveTo(1, H) ;
        Canvas.LineTo(PageWidth-1, H) ;
      end;
    EndDoc ;
  end;
end ;

Вариант 2. Вывожу горизонтальные линии случайным цветом попиксельно через массив Pixels.
Код: Выделить всё
var
   W, H : integer ;
begin
  with Printer do
  begin
    BeginDoc;
      randomize ;
      for H := 1 to PageHeight-1 do
      begin
        Canvas.Pen.Color := random(High(TColor-1)) ;
        for W := 1 to PageWidth-1 do
          Canvas.Pixels[W, H] := Canvas.Pen.Color ;
      end;
    EndDoc ;
  end;
end ;


Вариант 3
Вариант 1. Вывожу горизонтальные линии случайным цветом попиксельно с помощью команд MoveTo и LineTo.
Код: Выделить всё
var
   W, H : integer ;
begin
  with Printer do
  begin
    BeginDoc;
      randomize ;
      for H := 1 to PageHeight-1 do
      begin
        Canvas.Pen.Color := random(High(TColor-1)) ;
        for W := 1 to PageWidth-1 do
        begin
          Canvas.MoveTo(W, H) ;
          Canvas.LineTo(W, H) ;
        end ;
      end;
    EndDoc ;
  end;
end ;

В первом варианте размер данных, отправляемых на принтер, составляет 825 Кб, во втором - 666 Мб, а в третьем - 1,03 Гб. Как так, рисунки-то одинаковые? :shock:
Аватара пользователя
Vlad04
новенький
 
Сообщения: 78
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Размер картинки при выводе на принтер

Сообщение olegy123 » 06.09.2017 10:25:33

При сжатии шума размер сжатого равен объему исходника.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Размер картинки при выводе на принтер

Сообщение serbod » 06.09.2017 10:36:21

Многие принтеры понимают векторные картинки, из линий и кривых. А если рисовать не линиями, а пикселями, то это уже растровая картинка, совсем другой размер (с учетом высокого DPI принтера).
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Размер картинки при выводе на принтер

Сообщение Vlad04 » 07.09.2017 05:53:21

olegy123 писал(а):При сжатии шума размер сжатого равен объему исходника.

Во всех трёх случаях картинки получаются одинаковыми!
serbod писал(а):Многие принтеры понимают векторные картинки, из линий и кривых. А если рисовать не линиями, а пикселями, то это уже растровая картинка, совсем другой размер (с учетом высокого DPI принтера).

Сильно сомневаюсь, что TCanvas запоминает все команды отрисовки и отправляет их на принтер в векторном виде. В этом случае, если в Варинат 1 добавить цикл для троекратного повторения прорисовки линий, размер выходных данных должен увеличится в три раза?
С другой стороны, Вариант 3 использует линии, а не пиксели.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 78
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Размер картинки при выводе на принтер

Сообщение olegy123 » 07.09.2017 08:23:03

Vlad04 писал(а):
olegy123 писал(а):При сжатии шума размер сжатого равен объему исходника.

Во всех трёх случаях картинки получаются одинаковыми!

Попробуйте пережать видеофайл, или уже за архивированный уже файл - и попытайтесь объяснить почему два раза не имеет смысла это делать..
Это объяснит почему даже 3й вариант сжатая jpeg имеет в разы выше размер файла чем в среднем все файлы того же размера.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Размер картинки при выводе на принтер

Сообщение vitaly_l » 07.09.2017 08:23:42

Vlad04 писал(а):Сильно сомневаюсь, что TCanvas запоминает все команды отрисовки и отправляет их на принтер в векторном виде.

Вообще-то вместо принтера, картинку можно сохранять в файл и потом печатать на другом принтере. Учитывая что печатать можно с различным DPI то сохранение в виде растра - неприемлемо, т.к. потом невозможно качественно увеличить DPI, на другом принтере. А вот сохранение в векторном виде, наиболее разумно, т.к. при переносе на другой притер можно легко менять DPI. Соответственно в такие файлы записываются именно векторные команды, если они есть. А у Вас они есть. Соответственно и размер - меняется в зависимости от количества таких команд.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Размер картинки при выводе на принтер

Сообщение olegy123 » 07.09.2017 08:27:09

ну, до кучи - опровергните, что "белый шум" плохо сжимается.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Размер картинки при выводе на принтер

Сообщение vitaly_l » 07.09.2017 08:41:52

olegy123 писал(а):опровергните, что "белый шум" плохо сжимается

Для приличной печати - запрещено передавать изображения в формате JPG, т.к. он портит картинку. И ни одна уважающая себя типография, не возьмёт файл в JPG формате. Соответственно, при печати изображений, понятие "сжатие" - неприемлемо. Возможна только векторизация.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Размер картинки при выводе на принтер

Сообщение Лекс Айрин » 07.09.2017 09:40:33

vitaly_l, вообще-то сжатие картинок может быть и без потерь. Да и любимый формат типографистов (tiff) тоже далеко не векторный. Вообще, для приличной печати изображение должно быть гигантского размера -- от 5К точек и больше.

Кстати, как появятся батарейки для фотоаппарата могу показать потолок в одном из залов: jpg, печать по пленке, исходная картинка примерно 5-10Мб размером.

А насчет вектора... попробуй векторизовать средней сложности растр... у меня даже аватару не получилось и пришлось рисовать в векторном редакторе заново. Притом, что это заняло всего 2-3минуты, так как она просто оптимизирована для вектора.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Размер картинки при выводе на принтер

Сообщение vitaly_l » 07.09.2017 10:23:43

Лекс Айрин писал(а):насчет вектора... попробуй векторизовать средней сложности растр

В данной ситуации ненужно векторизовать, т.к. передаются "векторные" команды. Можно все команды записать в лог и посмотреть сколько он будет весить, если лень искать это в коде.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Размер картинки при выводе на принтер

Сообщение Vlad04 » 07.09.2017 10:42:21

olegy123 писал(а):
Vlad04 писал(а):Во всех трёх случаях картинки получаются одинаковыми!

Попробуйте пережать видеофайл, или уже за архивированный уже файл - и попытайтесь объяснить почему два раза не имеет смысла это делать..
Это объяснит почему даже 3й вариант сжатая jpeg имеет в разы выше размер файла чем в среднем все файлы того же размера.

Такое ощущение, что мы говорим о разных вещах. Не разбирался в этом вопросе, но вполне логично, что при передаче данных на принтер для снижения нагрузки на линию, драйвер данные сжимает, и принтер разжимает их. Но, даже в это случае, процесс запускается по команде Printer.EndDoc, и данные он берёт из компонента TCanvas. А в нём хранится один и тот же рисунок во всех 3-х случаях.
vitaly_l писал(а):Вообще-то вместо принтера, картинку можно сохранять в файл и потом печатать на другом принтере. Учитывая что печатать можно с различным DPI то сохранение в виде растра - неприемлемо, т.к. потом невозможно качественно увеличить DPI, на другом принтере. А вот сохранение в векторном виде, наиболее разумно, т.к. при переносе на другой притер можно легко менять DPI. Соответственно в такие файлы записываются именно векторные команды, если они есть. А у Вас они есть. Соответственно и размер - меняется в зависимости от количества таких команд.

Допустим, тогда, округляя размеры картинки в большую сторону, получаем 7000 (длина) * 5000 (высота) * 3 (RGB) / 1024 / 1024 = 100 Мб (примерно) чистый растр. Откуда 666 Мб?
P.S. Сохраняя эту картинку в bmp, получаю примерно 94 Мб. То есть всё верно. Отправляю на принтер bmp - передаваемый размер данных около 100 Мб. То есть не очень-то и сжимается.
Аватара пользователя
Vlad04
новенький
 
Сообщения: 78
Зарегистрирован: 11.12.2007 21:11:19
Откуда: Караганда. Казахстан

Re: Размер картинки при выводе на принтер

Сообщение Лекс Айрин » 07.09.2017 11:05:05

vitaly_l, и как ты подашь векторные команды на рисование растра? Да будет тебе известно, что, в отличии от плоттера, принтер формирует внутри себя растровую картинку, даже если ему передан вектор/текст. При этом, перевод растра в вектор это потери в качестве, а если в качестве исходника используется что-то сложнее книжки-раскраски, то вообще шанс на попадалово увеличивается на порядки. Так что, для картинки зачастую сжатый растр удобнее.

Vlad04, будет смешно, если все дело тупо в размере используемого канваса и цвета. Тем более, что принтерный канвас вполне может иметь и полиграфическую цветовую модель (CMYK), а на некоторых принтерах и большее количество цветов. Чем гадать, проще попытаться подсмотреть реализацию.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Размер картинки при выводе на принтер

Сообщение serbod » 07.09.2017 11:13:36

Предполагаю, что принтерный Canvas запоминает всю последовательность команд отрисовки и передает ее на принтер на векторном языке. А принтер их исполняет и отрисовывает на своем своем внутреннем Canvas.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Размер картинки при выводе на принтер

Сообщение vitaly_l » 07.09.2017 11:47:19

Vlad04 писал(а):Допустим, тогда, округляя размеры картинки в большую сторону, получаем 7000 (длина) * 5000 (высота) * 3 (RGB) / 1024 / 1024 = 100 Мб (примерно) чистый растр. Откуда 666 Мб?

Чем больше команд LineTo, MoveTo или Pixels - Вы отправляете тем больше файл. Соответственно, зависимость очевидна. 666 Мб вполне подходит под такие объёмы, т.к. команды занимают больше места чем просто картинка
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Размер картинки при выводе на принтер

Сообщение olegy123 » 07.09.2017 12:30:26

Вообще то есть принтера, которые сами не обладают возможностью декодирования общих форматов. За них эту роль выполняет драйвер.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Sharfik и гости: 46

Рейтинг@Mail.ru