Глюки при отработке StretchDraw

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

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

Ответить
de-signer
новенький
Сообщения: 12
Зарегистрирован: 24.06.2015 10:21:35

Глюки при отработке StretchDraw

Сообщение de-signer »

Привет всем.

Необходимо вывести картинку TBitmap на печать. Задача тривиальная Printer.Canvas.Draw(0, 0, bitmap). Реализую пробник:

Код: Выделить всё

    img := TBitmap.Create;
    prn := Printer;
    prn.BeginDoc;
    sz := 256;
    with img do begin
      HandleType := bmDIB;
      PixelFormat := pf32bit;
      Width := sz+1;
      height := sz;
      with Canvas do begin
        Brush.Style := bsSolid;
        Brush.Color := clWhite;
        FillRect(0, 0, sz, sz);
        Pen.Color := clBlack;
        Pen.Width := 2;
        MoveTo(0, 0);
        LineTo(sz, sz);
      end;
    end;
  prn.Canvas.Draw(0, 0, img)
  prn.EndDoc;

Под виндой всё хорошо. Под линуксом на цветной лазерник уходит нормально, а на монохромнике какая-то лажа
Изображение
Раз под виндой работает и на линуксе цветной тоже печатает значит драйвера? Ан не тут-то было! Вот это:

Код: Выделить всё

    q := TCairoPrinterCanvas(prn.Canvas);
    q.MoveTo(0, 0);
    q.LineTo(sz, sz);

Работает! И текст выводится, а вот ни Draw ни StretchDraw не отрисовывают картинку корректно. Причём на тестовой страница принтера лого Linux Mint явная картинка и выводится корректно.
Кто-нибудь сталкивался? Куда дальше копать мыслей уже нет.
P.S.: Lazarus 1.4.0 FPC 2.6.4

Добавлено спустя 1 минуту 14 секунд:
Картинка не прицепилась. Вот тут картинка

Добавлено спустя 8 минут 21 секунду:
Ха. Прикол. При sz=256

Код: Выделить всё

Image1.Picture.Bitmap.Canvas.StretchDraw(img.Canvas.ClipRect, img)
Не выводит на канву картинки _вообще ничего_ =)

Добавлено спустя 3 минуты 13 секунд:
... и при 512. =( Вобщем если ширина картинки кратна степени двойки и PixelFormat=pf32bit Draw даже на Bitmap'е ничего не рисует. Написал багрепорт.
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

А потом они мне еще будут говорить, что я один с линуксоидными сборками мучаюсь.....
Сочувствую.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Кто-нибудь сталкивался? Куда дальше копать мыслей уже нет.
На багтрекер?
Alex2013
долгожитель
Сообщения: 3211
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

1 А вообще принтер из под линя картинки печатает ?
2 Может проще записать витмап в файл и распечатать чем-то консольным ?
de-signer
новенький
Сообщения: 12
Зарегистрирован: 24.06.2015 10:21:35

Сообщение de-signer »

zub писал(а):На багтрекер?

Отправил.
Alex2013 писал(а):А вообще принтер из под линя картинки печатает ?

Тестовая страница - на ура.
java73 писал(а):Сочувствую.

Не стоит =)
Вопрос решил через трубу: взял widgetset qt.
Теперь другой вопрос: Я приложение под виндой запустить не могу. Требует mingw10.dll. Скачал последний mingw, а там этой библиотеки нет!
Сейчас буду копать версию qt, которая под линухом, дабы именно её подсунуть винде.
Подскажите, mingw для винды - это ясно, а что такое суть mingw для линукса? Это его штатные либы?

Добавлено спустя 2 часа 56 минут 1 секунду:
Нашёл нужный qt и mingw. Всё рисуется на пять с плюсом.
Следующий =) глюк. Разрешение принтера 600х600 dpi. Linux видит это, очём сообщает в диалоге настройки печати, а Printer.XDPI сообщает, что разрешение 1200x1200. Что блин за нафиг-то? Под виндой всё люкс.
Причём после печати (соответственно) получается изображение в два раза меньше и с мелкими точками на месте белого цвета (такое часто случается при криворуком сжатии картинки). Почитал, что 1200 - это разрешение Postscript, а дальше он подгоняет под канву на которой рисует, а мне вот это нафиг не сдалось. Как задать разрешение для принтера вручную?

Добавлено спустя 2 часа 41 минуту 24 секунды:
Нашёл в Qt: QtDefaultPrinter.Resolution := 600; Вот только что получится если нужный принтер будет не Default ?
Ответить