-
Как уже упоминалось в предыдущей главе, изображение в Java – это объект класса image. Там же показано, как в апплетах применяются методы getlmage() для создания этих объектов из графических файлов. | Приложения тоже могут применять аналогичные методы get image () класса Toolkit из пакета java.awt с одним аргументом типа string или URL.
-
Очень часто изображение перед выводом на экран подвергается обработке: меняются цвета отдельных пикселов или целых участков изображения, выделяются и преобразуются какие-то фрагменты изображения. | В библиотеке AWT применяются две модели обработки изображения.
-
Интерфейс imageConsumer нет нужды реализовывать, обычно используется его готовая реализация – класс imageFilter. Несмотря на название, этот класс не производит никакой фильтрации, он передает изображение без изменений.
-
В листинге 15.2 выделяется фрагмент изображения и выводится на экран в увеличенном виде. Кроме того, ниже выводятся изображения, увеличенные с помощью классов ReplicateScaleFilter и AreaAveragingScaleFilter. | Листинг 15.2. Примеры масштабирования изображения. | ♣import java.awt.*;
-
В листинге 15.3 меняются цвета каждого пиксела изображения. Это достигается просто сдвигом rgb >> 1 содержимого пиксела на один бит вправо в методе fiiterRGB (). При этом усиливается красная составляющая цвета. Метод fiiterRGB () переопределен в расширении colorFilter класса RGBImageFilter.
-
В листинге 15.4 определяется преобразование пикселов изображения. Создается новый фильтр – расширение Shiftfilter класса imageFilter, сдвигающее изображение циклически вправо на указанное в конструкторе число пикселов. Все, что для этого нужно, – это переопределить метод setPixels(). | Листинг 15.4.
-
Подобно тому, как вместо класса Graphics система Java 2D использует его расширение Graphics2D, описанное в главе 9, вместо класса image в Java 2D употребляется его расширение – класс Bufferedimage. В конструкторе этого класса: | Bufferedlmage(int width, int height, int imageType) | …задаются размеры изображения и способ хранения точек – одна из констант:
-
Преобразование изображения source, хранящегося в объекте класса Buffredlmage, В новое изображение destination выполняется методом filter(Buffredlmage source, Buffredlmage destination) описанным в интерфейсе BuffredimageOp.
-
Класс AffineTransform и его использование подробно разобраны в главе 9, здесь мы только применим его для преобразования изображения. | В конструкторе класса AffineTransformOp указывается предварительно созданное аффинное преобразование at и способ интерполяции interp и/или правила визуализации hints: | AffineTransformOp(AffineTransform at, int interp);
-
Изменение интенсивности изображения выражается математически в умножении каждой составляющей цвета на число factor и прибавлении к результату умножения числа offset. Результат приводится к диапазону значений составляющей.
-
Чтобы изменить отдельные составляющие цвета, надо прежде всего посмотреть тип хранения элементов в Bufferedimage, по умолчанию это TYPE_INT_RGB. Здесь три составляющие – красная, зеленая и синяя. Каждая составляющая цвета занимает один байт, все они хранятся в одном числе типа int.
-
Операция свертки (convolution) задает значение цвета точки в зависимости от цветов окружающих точек следующим образом. | Пусть точка с координатами (х, у) имеет цвет, выражаемый числом А(х, у). Составляем массив из девяти вещественных чисел w(0), w(1),… w(8).
-
Есть несколько способов создать анимацию. Самый простой из них – записать заранее все необходимые кадры в графические файлы, загрузить их в оперативную память В виде Объектов класса Image или Bufferedlmage и выводить по очереди на экран. | Это сделано в листинге 15.9.
-
Суть двойной буферизации в том, что в оперативной памяти создается буфер – объект класса image или Bufferedimage, и вызывается его графический контекст, в котором формируется изображение. Там же происходит очистка буфера, которая тоже не отражается на экране.
-
Как было указано в предыдущей главе, в апплетах реализуется интерфейс Audioclip. Экземпляр объекта, реализующего этот интерфейс можно получить методом getAudioClip(), который, кроме того, загружает звуковой файл, а затем пользоваться методами play (), loop () и stop () этого интерфейса для проигрывания музыки.
-
Проигрыватель звука, встроенный в JVM, рассчитан на два способа записи звука: моно и стерео оцифровку (digital audio) с частотой дискретизации (sample rate) от 8 000 до 48 000 Гц и аппроксимацией (quantization) 8 и 16 битов, и MIDI-последовательности (sequences) типа 0 и 1.
-
Синтез звука заключается в создании MIDI-последовательности – объекта класса sequence – каким-либо способом: с микрофона, линейного входа, синтезатора, из файла, или просто создать в программе, как это делается в листинге 15.18.