Уменьшение PPI изображения (пикселей на дюйм) с сохранением физических размеров - PullRequest
0 голосов
/ 11 июля 2020

Я разрабатываю программное обеспечение для полиграфической промышленности, и мне нужно преобразовать загруженные изображения с высоким качеством и высоким PPI (например, 300) в изображения с низким PPI (например, 40) с такими же физическими размерами в дюймах. например, преобразовать изображение с разрешением 300 PPI и 10x10 (дюйм x дюйм) в изображение с разрешением 50 PPI и 10x10 (дюйм x дюйм) это преобразование важно, потому что мы хотим отображать низкокачественное изображение для пользователя с другими прозрачными слоями из-за предварительного просмотра фактического окончательного результата печати. это изображение - другой пример как это сделать в Java или Kotlin?

1 Ответ

0 голосов
/ 13 июля 2020

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

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

val path = "Y:\\our\\path\\\\to\\directory\\"

val sourceImage = ImageIO.read(File("${path}original.png"))

val smallerImage = BufferedImage(
        sourceImage.width / 2,
        sourceImage.height / 2,
        sourceImage.type
)

var graphics2D = smallerImage.createGraphics()
graphics2D.drawImage(
        sourceImage,
        0,
        0,
        sourceImage.width / 2,
        sourceImage.height / 2,
        null
)
graphics2D.dispose()

Здесь smallerImage уменьшено - теперь мы используем в 4 раза меньше пикселей (потому что мы масштабируем на 2 и ширину, и высоту), чем мы изначально использовали.

Это позволяет использовать меньше пикселей, но размер не был сохранен - ​​он был уменьшен. Теперь нам нужно растянуть его до исходного размера, но теперь мы будем использовать меньшее количество пикселей:

val stretched = smallerImage.getScaledInstance(
        sourceImage.width,
        sourceImage.height,
        Image.SCALE_DEFAULT
)

val destination = BufferedImage(
        sourceImage.width,
        sourceImage.height,
        sourceImage.type
)

graphics2D = destination.createGraphics()
graphics2D.drawImage(stretched, 0, 0, null)
graphics2D.dispose()

Наконец, мы сохраняем изображение в файл:

val destinationImageFile = File("${path}destination.png")
ImageIO.write(destination, "png", destinationImageFile)

И мы закончили. Изображения original и destination:

Original image (16x16) Назначение (изменено) изображение (16x16)

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

...