Печать на Java - Printable.print () изменяет размеры изображений - PullRequest
1 голос
/ 13 января 2012

У меня есть пользовательский отчет, который рисует через Graphics2D и использует множество крошечных BufferedImage спрайтов. PrinterJob.print(), кажется, вызывает Printable.print() примерно один раз для каждого спрайта (фактическое число может варьироваться в обоих направлениях), поэтому некоторые страницы перерисовываются 150 раз ... Это приводит к недопустимо медленной печати, около 10 секунд для двух стр.

Я нашел это: Почему метод печати java Printable вызывается несколько раз с одним и тем же номером страницы?

Но, похоже, это не объясняет мою конкретную проблему (или объясняет только частично). Я создал отчет об испытаниях, который имеет только несколько спрайтов, и было небольшое количество изменений размера, которые увеличивались и уменьшались при добавлении и удалении изображений по вертикальной или горизонтальной осям.

При печати в PDF с использованием Bullzip я заметил, что после увеличения изображений они масштабируются с использованием билинейного или бикубического алгоритма. Одно из этих изображений, которое уникально тем, что имеет индексированную цветовую палитру, не масштабируется. Я подтвердил, что масштабирование является поведением Java и не выполняется Bullzip, печатая на реальном принтере и наблюдая, как масштабируются те же изображения, а не как нет.

Таким образом, мне кажется, что API печати пытается изменить масштаб изображения до того значения DPI, которое он имеет в виду, но по какой-то причине он вызывает Printable.print() каждый раз, когда сталкивается с изображением, которое, по его мнению, нуждается в этой обработке.

Как мне исправить это поведение? Я попытался установить подсказки рендеринга для Graphics2D, которые я получаю при вызове Printable.print(), но безрезультатно. Я не знаю, что еще делать, если не попытаться найти и изучить исходный код API печати. ​​

1 Ответ

0 голосов
/ 18 января 2012

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

Я заметил, что растеризатору печати Java не нравятся вещи с полупрозрачностью (в одном отчете, в котором он использовался, использовалосьПолностью растеризованный, я думаю, 300dpi ...), но я забыл, что на этих изображениях также были альфа-каналы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...