2011-08-27 3 views
1

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

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 автоматически делает все по умолчанию «материал» он должен сделать? Может быть, причина, по которой автор этого кода выбрал другой способ, потому что он хотел достичь некоторого поведения, отличного от дефолта? При написании ответа, пожалуйста, поймите, что я ищу простой способ решить проблему загрузки изображений, а также способность и понимание применять более сложные средства, если это необходимо.

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

+0

Это гарантирует, что программисты java хорошо платят за простые задачи :-D – Ali

+0

возможно, вопрос лучше размещен на programers.stackexchange.com – Ali

+2

На самом деле эта функция не должна компилироваться. Вы возвращаете экземпляр класса «Image», когда метод объявлен для возврата 'BufferedImage'. –

ответ

4

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

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

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

+0

Вот и я думал. Код из учебника выглядит «старым» во многих отношениях. Я полностью понимаю, что волнуют люди, которым приходилось писать без этого много лет назад. Но времена меняются, и особенно в ИТ-задачах становится более простым пропорционально. Я думаю, что ожидание задачи «загрузить мой образ в одной команде» не слишком сильно зависит от сильного современного языка. Это просто означает, что кто-то должен попытаться записать эти 10.000 строк в JVM. – erikbwork

+0

@erikb Вы можете привести пример этой одной функции (или языка), где она принимает один аргумент и загружает изображение из любого места и возвращает изображение, которое готово для отображения везде? –

+0

@ Никита не может представить себе после того, как вы отделите функцию от вопроса, что довольно легко получить языкVM для этого? Автору языка просто нужно решить одно поведение по умолчанию (которое может быть тем же, что выполняется выше). Предоставление пользователю языка по умолчанию - это просто вопрос о том, насколько вы цените юзабилити. И я до сих пор не могу представить, что в Java нет способа по умолчанию. Попробуйте python, например: 'Image.load (" anImage.gif ")' (да, вам нужна еще одна строка для импорта Image. Я также не считал строки импорта в примере Java) – erikbwork

2

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

BufferedImage изображение = ImageIO.read (см);

Фактически, «загрузка изображения» IS это легко.

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

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

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

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

  • Способность mix'n'match, в которой происходит материал, как вы его используете, и где он идет по желанию, одинаково замечателен.

ИМХО ...

1

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

Смежные вопросы