как отобразить целое изображение на фиксированном размере холста?

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

Я использую следующий код:

private void displayImage(File file) {

    try 
    {
        BufferedImage image = ImageIO.read(file);
        ta.Picture = image;
    }
    catch (Exception e) 
    {}

    Graphics g = ta.imageCanvas.getGraphics();
    g.clearRect(0, 0, 300, 300);
    g.drawImage(ta.Picture, 00, 00, this);

}//displayImage

public void valueChanged(TreeSelectionEvent e) 
{
   //TODO Auto-generated method stub
    FileTreeNode node = (FileTreeNode) tree.getLastSelectedPathComponent();

    if (node.isLeaf()) 
    {

        currentFile = node.file;

        File ff = new File("F:/images_blue/" + currentFile.getName());
        displayImage(ff);

    } else
        currentFile = null;

}
1
nl ja de
Взгляните на и this и this и это
добавлено автор MadProgrammer, источник
BTW - Applet + BufferedImage image = ImageIO.read (файл); будет катастрофой во время развертывания. Ресурсы для апплетов обычно доступны по URL-адресу, сформированному относительно кода или базы документов апплета.
добавлено автор Andrew Thompson, источник

2 ответы

Я просто хотел бы отметить, что ...

Graphics g = ta.imageCanvas.getGraphics();
g.clearRect(0, 0, 300, 300);
g.drawImage(ta.Picture, 00, 00, this);

Это действительно плохая идея.

getGraphics may return null and is, at best, simply a snapshot of the last repaint cycle and could be invalidated or dereferenced on the next paint cycle.

Вы должны распространяться от чего-то вроде JPanel и переопределять метод paintComponent . Это позволит вам поставлять геттер и сеттер отдельно от управления изображением и позволять создавать масштабированное изображение в автономном и многоразовом режиме

Вы просматриваете Perfoming Custom Painting для меня информация

И, в соответствии с моим комментарием, вы можете проверить эти предыдущие вопросы для примеров

2
добавлено
+1 .. и я также приведу связанные примеры: P. @mohit_pipariya См. этот вариант и расширенный пример .
добавлено автор David Kroukamp, источник

вы можете масштабировать BufferedImage, как это.

BufferedImage before = getBufferedImage(encoded);
int w = before.getWidth();
int h = before.getHeight();
BufferedImage after = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
AffineTransform at = new AffineTransform();
at.scale(2.0, 2.0);
AffineTransformOp scaleOp = 
   new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
after = scaleOp.filter(before, after);

Я нашел здесь фрагмент

1
добавлено
+1 для приятной альтернативы :)
добавлено автор David Kroukamp, источник
Разве это не масштабирует изображение до двух раз?
добавлено автор MadProgrammer, источник
@AndrewThompson да, это тоже может работать: P
добавлено автор MadProgrammer, источник
@mohit_pipariya Да, если вы используете значение доли ниже единицы, оно уменьшит масштаб изображения. Что вы подразумеваете под «закодированным»?
добавлено автор MadProgrammer, источник
@MadProgrammer «Да, если вы используете значение доли ниже нуля, оно уменьшит масштаб изображения« By »значение ниже нуля« DYM »значение ниже единицы?
добавлено автор Andrew Thompson, источник
@MadProgrammer да его двойной размер изображения ...
добавлено автор user1983527, источник
@ user1983527 Я хочу уменьшить размер, будет ли он работать, если я буду держать шкалу = 0,5? и что закодировано в коде выше?
добавлено автор mohit_pipariya, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async