Оригинал

https://drive.google.com/file/d/1B3xxfWkGsMs2_MQ_bUQ8_ALYI0DL-LIo/view?usp=sharing

При сохранении в файл

https://drive.google.com/file/d/1z5euXupeHmiFebch4A39fVqGukoUiK0p/view?usp=sharing

При печати на холсте

https://drive.google.com/file/d/1VouD-ygf0pPXFFx9Knr4pv44FHMtoqcV/view?usp=sharing

BufferedImage temp = bImg.getSubimage(100, 100, (int)imgWidth - 100, (int)imgHeight - 100);
    try{
        ImageIO.write(temp, "png", new File("test.png"));
     }catch(Exception e){
          e.printStackTrace();
     }
     gc.drawImage(SwingFXUtils.toFXImage(temp, null), 100, 100);

По какой-то причине, если я печатаю изображение на холсте, оно отличается от того, если я сохраняю то же изображение в файл. Когда я сохраняю его в файл, он правильно вычисляет subImage, но когда я печатаю его на холст, он игнорирует координаты x и y, которые я ему даю, и принимает subImage, используя (0,0) как (x, y) с заданной шириной и высота.

4
Brandon Kirincich 20 Дек 2019 в 18:21

1 ответ

Лучший ответ

Из документация по методу getSubimage:

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

Дополнительное изображение - это просто «окно» в исходное изображение; они используют одни и те же данные пикселей.

документация по SwingFXUtils.toFXImage гласит:

Делает снимки указанного BufferedImage и сохраняет копию его пикселей в объекте JavaFX Image, создавая при необходимости новый объект.

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

А пока вы можете обойти это, извлекая фрагмент изображения самостоятельно:

BufferedImage cropped = new BufferedImage(
    (int) imgWidth - 100,
    (int) imgHeight - 100,
    bImg.getType());

Graphics g = cropped.getGraphics();
g.drawImage(bImg, -100, -100, null);
g.dispose();

gc.drawImage(SwingFXUtils.toFXImage(cropped, null), 100, 100);
4
VGR 20 Дек 2019 в 20:50