Плохое качество изображений при использовании GDI + с драйвером PostScript - PullRequest
0 голосов
/ 14 октября 2019

Я разрабатываю программу для печати изображений различных форматов (BMP, JPEG, EMF, ...) на HDC с использованием C ++ и Windows GDI +. Используя драйвер MS Publisher Imagesetter, я могу создать файл postscript, а с помощью функций GhostScript - файл PDF. Если я попытаюсь напечатать следующее изображение:

enter image description here

я получу следующий результат плохого качества с этими странными квадратами (не представлен на исходном изображении):

enter image description here

Часть моего кода, которую я использовал для печати изображения:

SetMapMode(hdcPrint,MM_TEXT);
Gdiplus::Graphics graphics(hdcPrint);
graphics.SetPageUnit(Gdiplus::UnitMillimeter);
Gdiplus::Image* image = Gdiplus::Image::FromFile(srPicture->swPathImage); 
graphics.DrawImage(image,x,y,w,h);

Я пытался напечатать то же изображениесо многими драйверами и различными типами форматов (отличается от PostScript: PDF, EMF, настоящий принтер), и результат всегда приемлем (квадратов нет). Кроме того, я попытался открыть результат плохого качества с помощью программы чтения PDF, отличной от Adobe Acrobat Reader DC (Wondershare PDFelement и Chrome), и даже тогда результат был приемлемым. Я также заметил, что если изображение содержит несколько различных форм (то есть большую красную линию, как на следующем изображении), результат также будет хорошим.

enter image description here

На данный момент я понятия не имею, является ли проблема Adobe Reader или моей реализацией. Существует ли другой способ печати изображений различных форматов с помощью GDI + (или чистого GDI)?

Созданный файл PostScript: this .

1 Ответ

3 голосов
/ 14 октября 2019

Ну ... Вы не предоставили ни файлы PostScript, ни PDF-файлы, что затрудняет комментирование.

Для меня не совсем очевидно, в какой момент вы получаете изображение, которое показываете,это то, что вы видите в файле PDF? Это то, что вы получаете при печати файла PDF на физическом принтере? Если это последний вопрос, как вы печатаете файл PDF на принтере?

Файл JPEG, на который вы указали ссылку, очень маленький (6 КБ), вы действительно пытаетесь использовать этот файл JPEG?

Мое предположение (а при отсутствии каких-либо файлов - это все, что может быть), что вы используете старую версию Ghostscript. Старые версии распаковывали изображение JPEG, а затем повторно сжимали изображение, используя любой фильтр, который давал наименьший результат, обычно снова JPEG.

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

Более новые версии Ghostscript не распаковывают данные изображения JPEG при переходе на устройство pdfwrite, если только другие варианты (например, преобразование цвета, уменьшение изображения и т. Д.) Не делают это необходимым. Текущая версия Ghostscript - 9.27, а выпуск 9.28 - неизбежен, я бы посоветовал вам попробовать один из них.

Другая возможность состоит в том, что либо программа PostScript была создана таким образом, чтобы выродитьсякаждое изображение попало в прямоугольник, или вы используете чрезвычайно старую версию Ghostscript, где также использовался этот метод.

Обратите внимание, что ни один из них, по моему мнению, не приведет к точнорезультат, который вы вставили сюда, но версию, безусловно, стоит изучить. Публикация файла программы PostScript (то есть файла, который вы отправляете в Ghostscript) была бы более полезной, поскольку это позволило бы мне хотя бы сузить место возникновения проблемы.

[EDIT]

Похоже, эта ошибка является интригующей ошибкой в ​​Acrobat.

Программа PostScript использует функцию передачи цвета для инвертирования образцов цвета изображения RGB JPEG. (это осуждается на практике, не то, для чего нужны передаточные функции, но это не редкость). Устройство pdfwrite в Ghostscript сохраняет функцию передачи.

При правильном отображении Ghostscript, как и ожидалось, Acrobat, однако, впечатляюще не дает этого, я понятия не имею, какой беспорядок они сделали, что приводит к полученному результату. но это явно не так.

Если я изменю производственные параметры pdfwrite в Ghostscript, чтобы применить функции передачи вместо их сохранения:

-c "<</TransferFunctionInfo /Apply>> setdistillerparams" -f PostScript.ps

, тогда полученный файл будет корректно отображаться в Acrobat. Если я изменю настройки Adobe Acorbat, чтобы он использовал «Сохранить» вместо «Применить» для функций передачи (см. «Настройки» -> «Изменить параметры Adobe PDF», затем вкладку «Цвет» и «Когда функции передачи найдены»), установите раскрывающийся список на «Сохранить». вместо «Применить») полученный PDF-файл отображается правильно в Ghostscript, и в Acrobat тот же тип ошибок, что и в выходном файле pdfwrite Ghostscript.

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

...