Загрузка изображения - PullRequest
       0

Загрузка изображения

1 голос
/ 27 августа 2011

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

public Image loadImage(... String ref ...) {
  ...
    URL url = this.getClass().getClassLoader().getResource(ref);
    BufferedImage source = ImageIO.read(url);
    GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
    Image image = gc.createCompatibleImage(source.getWidth(), source.getHeight(), Transparency.BITMASK);

    image.getGraphics().drawImage(source, 0, 0, null);
    return image;
}

Это абсолютно не лучший способ с точки зрения удобства использования и ясности (= никто не мог найти этот способ простоиспользуя свой здоровый мозг).Почему это так сложно?Это должно быть?Почему загрузка изображений не может быть такой простой:

BufferedImage image = ImageIO.read(ref);

Есть ли более простой способ, если вы просто хотите загрузить изображение таким образом, чтобы Java автоматически выполняла все «стандартные вещи», которые он долженделать?Может быть, есть причина, по которой автор этого кода выбрал другой путь, потому что он хотел добиться поведения не по умолчанию?При написании ответа, пожалуйста, поймите, что я ищу простой способ решения проблемы загрузки изображений, а также способность и понимание применять более сложные средства, если это необходимо.

edit: Такжеоба ответа являются хорошим представлением мнений их авторов, до сих пор я не могу accept один ответ, потому что ни один ответ не показывает более простой способ и / или не объясняет, что именно происходит.

Ответы [ 3 ]

4 голосов
/ 27 августа 2011

Ну, здесь происходит гораздо больше.URL открывается, содержимое URL загружается в буфер.Изображение загружается из буфера.Он конвертируется в растровое изображение, совместимое с устройством.

Я думаю, что 4 строки кода, чтобы сделать все это, довольно круто.Я не хочу показаться старым, но когда я хотел нарисовать растровое изображение в Ye Olde C ++ в DOS, мне сначала пришлось посетить библиотеку, чтобы получить книгу о различных растровых форматах, а затем написать около 10.000 строк кода для поддержки тольконесколько из них ... А потом я только что получил растровое изображение (которое является самым простым из изображений) на локальном компьютере.Нет JPG, нет сетей, не говоря уже о Интернете, и, конечно, не кросс-платформенный.

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

2 голосов
/ 27 августа 2011

Почему загрузка изображения не может быть такой простой:

BufferedImage image = ImageIO.read (ref);

На самом деле, "загрузка изображения" IS это просто.

GolezTrol совершенно прав: там IS здесь много чего происходит:

  • Предыдущий код динамически получает ссылку на любой графический объект, который необходимо загрузить. Вы также можете легко передать имя файла, URL-адрес или ссылку на файл Java (среди многих других возможностей).

  • Следующий код получает ссылку на графическое окружение для отображения графики. Если бы вы вызвали drawImage () внутри метода OnPaint () компонента GUI, вся эта работа уже была бы сделана за вас.

  • Возможность декодировать практически любой графический файл и возможность отображать его практически в любом графическом окружении в одну строку в каждой IS чертовски круто!

  • Способность смешивать и сравнивать, откуда приходит материал, как вы его используете и куда идет по желанию, одинаково потрясающая.

ИМХО ...

1 голос
/ 28 августа 2011

Я немного погуглил и думаю, что нашел ответ на ваш вопрос.Оптимизация BufferedImage для данного устройства поддерживает способ загрузки изображения из учебника игры, в зависимости от глубины цвета устройства, разрешения устройства и цветовой модели.Существует еще одна причина использования этой версии кода, а именно кеширование изображений в более ранних версиях Java.В более ранних версиях JVM помечает образ как управляемый (включает аппаратное ускорение), когда вы загружаете его, как говорится в учебнике, при этом он не помечает его как управляемый, если он загружается с использованием ImageIO.read (..).Вы можете увидеть полное объяснение в этом посте .Надеюсь, это поможет.

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