Подтвердить что ты не робот

Как работает Java Graphics.drawImage() и какова роль ImageObserver

Как использовать Java drawImage()? Я не очень хорошо разбираюсь в документации JDK. Например, для всех подписей drawImage требуется ImageObserver, но документация для этого не очень полезна для новых пользователей.

4b9b3361

Ответ 1

Вы можете уйти с Graphics.drawImage(img, x, y, null) [или аналогичным]. Параметр ImageObserver - это обратный вызов для информирования вас о ходе операции рисования; и действительно полезно, только если вы извлекаете параметр Image асинхронно.

Чтобы быть более четким, если вы вызываете drawImage с неполностью загруженным изображением, он будет:

  • return false (немедленно)
  • максимально возможное количество Image (все, что загружено)
  • и, в какой-то момент, вызовите ImageObserver, когда доступно больше изображений

В принципе, если вы работаете с памятью Image (загружаемой из файловой системы или созданной вашей программой), не беспокойтесь о параметре ImageObserver. Если вы загружаете Image по сети и явно не ожидаете их загрузки, вам необходимо использовать ImageObserver, чтобы убедиться, что "полностью" нарисовать Image.

Ответ 2

Image объекты не обязательно полностью загружены. Если Graphics.drawImage вызывается на неполном изображении, он будет рисовать как можно больше изображения, а затем предупреждает ImageObserver (вызывая imageUpdate), когда загружается больше изображения.

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

Обратите внимание, что Component реализует ImageObserver, а его метод imageUpdate вызывает repaint в затронутой области.

Ответ 3

Вообще-то, я всегда использовал drawImage() всегда с параметром ImageObserver, установленным на null. Хорошо, это не значит, что это бесполезно, но я делал все, что мне нужно, не зная его использования.

Ответ 4

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

В этом случае drawImage ничего не может сделать при первом вызове. По мере того, как размер и пиксели становятся доступными, уведомление об ImageObserver уведомляется. В случае Component implements ImageObserver его поведение заключается в перерисовке, когда доступны данные.