Я не могу уменьшить масштаб пикселя до одного пикселя без сглаживания - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь уменьшить пиксельное изображение (из долины звездной росы), состоящее из 4x4 пикселей на блок одного цвета, до того же изображения с 1x1 пикселем на блок.

Photoshop отлично работает, когда я просто изменяю его размер с помощью интерполяции NEAREST_NEIGHBOUR.

Но когда я использую технику из: Как масштабировать BufferedImage но вместо TYPE_NEAREST_NEIGHBOR все уничтожается.

Что не так и как мне исправить это?

            BufferedImage old = getScreenShot();
            int w = old.getWidth();
            int h = old.getHeight();

            int newWidth = w/4;
            int newHeight = h/4;


            BufferedImage resized = new BufferedImage(newWidth, newHeight, old.getType());
            AffineTransform at = new AffineTransform();
            at.scale(0.25, 0.25);
            AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
            resized = scaleOp.filter(old, resized);

            //TODO (remove)  for debugging the screencapture capability
            File outputfile = new File("C:/Users/Kevin/Desktop/imagetestmap/test.jpg");
            try {
                ImageIO.write(resized, "jpg", outputfile);
            } catch (IOException e) {
                e.printStackTrace();
            }


            return resized;

фактический скриншот:

actual screenshot

что видит фотошоп:

what photoshop sees

что видит моя программа:

what my program sees

1 Ответ

0 голосов
/ 25 апреля 2019

Крис Луенго нашел решение, я должен был использовать .png вместо jpg.

Это рабочий код:

            BufferedImage old = getScreenShot();
            int w = old.getWidth();
            int h = old.getHeight();

            int newWidth = w/4;
            int newHeight = h/4;


            BufferedImage resized = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);

             AffineTransform at = new AffineTransform();
            at.scale(0.25, 0.25);
            AffineTransformOp scaleOp = new AffineTransformOp(at, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
            resized = scaleOp.filter(old, resized);

            //TODO (remove)  for debugging the screencapture capability
            File outputfile = new File("C:/Users/Kevin/Desktop/imagetestmap/test.png");
            try {
                ImageIO.write(resized, "png", outputfile);
            } catch (IOException e) {
                e.printStackTrace();
            }

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