Как записать image в файл java

Обновлено: 04.07.2024

Вы можете загружать и изменять изображения, используя классы, предоставляемые JavaFX в пакете javafx.scene.image . JavaFX поддерживает форматы изображений, такие как Bmp, Gif, Jpeg, Png .

В этой главе вы узнаете, как загружать изображения в JavaFX, как проецировать изображение в нескольких видах и как изменять пиксели изображения.

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

Вы можете загрузить изображение в JavaFX, создав экземпляр класса с именем Image пакета javafx.scene.image .

В конструктор класса вы должны передать одно из следующих:

Объект InputStream загружаемого изображения или,

Строковая переменная, содержащая URL-адрес изображения.

Объект InputStream загружаемого изображения или,

Строковая переменная, содержащая URL-адрес изображения.

После загрузки изображения вы можете установить представление для изображения, создав экземпляр класса ImageView и передав изображение в его конструктор следующим образом:

пример

Ниже приведен пример, который демонстрирует, как загрузить изображение в JavaFX и установить представление.

Сохраните этот код в файле с именем ImageExample.java .

import java . io . FileInputStream ; import java . io . FileNotFoundException ; import javafx . application . Application ; import javafx . scene . Group ; import javafx . scene . Scene ; import javafx . scene . image . Image ; import javafx . scene . image . ImageView ; import javafx . stage . Stage ; public class ImageExample extends Application < @Override public void start ( Stage stage ) throws FileNotFoundException < //Creating an image Image image = new Image ( new FileInputStream ( "path of the image" )); //Setting the image view ImageView imageView = new ImageView ( image ); //Setting the position of the image imageView . setX ( 50 ); imageView . setY ( 25 ); //setting the fit height and width of the image view imageView . setFitHeight ( 455 ); imageView . setFitWidth ( 500 ); //Setting the preserve ratio of the image view imageView . setPreserveRatio ( true ); //Creating a Group object Group root = new Group ( imageView ); //Creating a scene object Scene scene = new Scene ( root , 600 , 500 ); //Setting title to the Stage stage . setTitle ( "Loading an image" ); //Adding scene to the stage stage . setScene ( scene ); //Displaying the contents of the stage stage . show (); >public static void main ( String args []) < launch ( args ); >>

Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды.

При выполнении вышеупомянутая программа генерирует окно JavaFX следующим образом:

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

Вы также можете установить несколько видов для изображения в одной и той же сцене. Следующая программа представляет собой пример, который демонстрирует, как установить различные представления для изображения в сцене в JavaFX.

Сохраните этот код в файле с именем MultipleViews.java .

Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды.

При выполнении вышеупомянутая программа генерирует окно JavaFX следующим образом:

Множественный вид

Пишущие пиксели

JavaFX предоставляет классы с именами PixelReader и PixelWriter для чтения и записи пикселей изображения. Класс WritableImage используется для создания доступного для записи изображения.

Ниже приведен пример, который демонстрирует, как читать и записывать пиксели изображения. Здесь мы читаем значение цвета изображения и делаем его темнее.

Сохраните этот код в файле с именем WritingPixelsExample.java .

Скомпилируйте и выполните сохраненный файл Java из командной строки, используя следующие команды.

При выполнении вышеупомянутая программа генерирует окно JavaFX следующим образом:

Special for До этого я пояснял на сухих примерах. Попросили работу с изображениями - ловите.

Постановка учебной задачи.

Дан графический файл (jpeg, png . ). Необходимо сделать с ним некие манипуляции и записать результат в другой файл. Для упрощения рассмотрим три задачи: - получить негатив изображения - получить черно-белый вариант изображения (сбросить цветность) - изменить насыщенность зеленого цвета в изображении. Заметим, что аналогичным способом мы можем, добавляя новые методы реализовывать и другие задачи: - увеличить резкость или размытие - изменить размеры - повернуть по/против часовой. - и другие возможность Фотошопа :) вообщем реализовать любой алгоритм над изображением, насколько у нас хватит фантазии и знания матана (например, распознать количество возможных котиков на картинке).

Немного сухой теории.

Мы рассматриваем растровые изображения (есть еще векторные и другие). То есть, когда файл, помимо собственно заголовка со служебной информацией, хранит прямоугольную матрицу точек. Аналогично экрану современного HD-телевизора у которого разрешение 1920х1080 точек и каждая точка представлена как значения трех составляющих цвета: R(ed), G(reen), B(lue) = Красный, Зеленый и Синий. Эти цвета независимы и данная модель взята из биологии восприятия цвета. В глазу у нас есть колбочки и палочки. Колбочки трех разновидностей (реагируют на соответствующий одной из трех диапазонов длин волн), палочки "обрабатывают" яркость цвета (амплитуду световой волны). В модели RGB палочки отвечают за значение составляющей (0 - отсутствие, 255- самый яркий свет), а колбочки - соответственно в какие из R / G / B помещать соответствующую интенсивность. Например: Отсутствие света - палочки /колбочки не реагируют и RGB=(0,0,0). Яркий белый свет - все колбочки реагируют равномерно, палочки фигеют и RGB = (255,255,255). Серая мышка пробежала - все колбочки реагируют равномерно, палочки реагируют средне и RGB = (127,127,127). Темно-оранжевый - реагируют R и G палочки, палочки едва откликаются, RGB=(30, 30, 0) .

Приступим к практике.
Я писал для примера работы с байтами, поэтому код не вылизан по всем правилам и далеко не оптимален: мы не проверяем входные параметры, не делаем полноценную проверку ошибок и т.п. Писалось в лоб, без рефакторинга. Основной упор - работа с байтами-битами. Напишем, по аналогии задач JavaRush консольную утилиту, которая при вызове в командной строке с соответствующими аргументами модифицирует изображение. Исходное изображение:
вызов с параметрами -n kitten.jpg newkitten.jpg создаст картинку:
вызов с параметрами -b kitten.jpg newkitten.jpg создаст картинку:
вызов с параметрами -gr kitten.jpg newkitten.jpg создаст картинку:

В этом уроке мы рассмотрим несколько доступных библиотек обработки изображений и выполним простую операцию обработки изображений – загрузим изображение и нарисуем на нем фигуру.

Мы попробуем МОКРУЮ (и немного качающуюся) библиотеку, ImageJ, OpenIMAJ и двенадцать обезьян.

2. AWT

AWT-это встроенная библиотека Java, которая позволяет пользователю выполнять простые операции, связанные с отображением, такие как создание окна, определение кнопок и прослушивателей и так далее. Он также включает в себя методы, позволяющие пользователю редактировать изображения. Он не требует установки, так как поставляется с Java.

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

Первое, что нужно сделать, это создать объект BufferedImage из изображения, сохраненного на нашем диске:

2.2. Редактирование изображения

В данном конкретном случае нам нужно Graphic 2D расширить ширину фигуры, чтобы сделать ее четко видимой. Мы достигаем этого, увеличивая его свойство s troke . Затем мы задаем цвет и рисуем прямоугольник таким образом, чтобы форма была в десяти пикселях от границ изображения:

2.3. Отображение изображения

Теперь, когда мы нарисовали что-то на нашем изображении, мы хотели бы показать это. Мы можем сделать это с помощью объектов библиотеки Swing. Сначала мы создаем JLabel объект, представляющий область отображения текста или/и изображения:

Затем добавьте наш JLabel в JPanel , который мы можем рассматривать как графического интерфейса на основе Java:

В конце концов, мы добавляем все в JFrame , который является окном, отображаемым на экране. Мы должны установить размер, чтобы нам не приходилось расширять это окно каждый раз, когда мы запускаем нашу программу:

3. ImageJ

ImageJ-это программное обеспечение на базе Java, созданное для работы с изображениями. В нем довольно много плагинов, доступных здесь . Мы будем использовать только API, так как хотим выполнять обработку самостоятельно.

Это довольно мощная библиотека, лучше, чем Swing и AWT, так как целью ее создания была обработка изображений, а не операции с графическим интерфейсом. Плагины содержат много бесплатных алгоритмов, что хорошо, когда мы хотим научиться обработке изображений и быстро увидеть результаты, а не решать математические и оптимизационные задачи, лежащие в основе алгоритмов IP.

3.1. Зависимость Maven

Чтобы начать работу с ImageJ, просто добавьте зависимость в вашего проекта pom.xml файл:

Вы найдете самую новую версию в репозитории Maven .

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

Чтобы загрузить изображение, вам нужно использовать метод open Image() static, из I J класс:

3.3. Редактирование изображения

Для редактирования изображения нам придется использовать методы из Image Processor object, прикрепленные к нашему ImagePlus объекту. Думайте об этом как о Графике объекте в AWT:

3.4. Отображение изображения

Вам нужно только вызвать show() метод Image Plus object:

4. OpenIMAJ

4.1. Зависимость Maven

Чтобы начать работу с OpenIMAJ, просто добавьте зависимость в вашего проекта pom.xml файл:

Вы найдете последнюю версию здесь .

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

Чтобы загрузить изображение, используйте метод ImageUtilities.readMBF() :

MBF означает многополосное изображение с плавающей запятой (RGB в этом примере, но это не единственный способ представления цветов).

4.2. Редактирование изображения

Чтобы нарисовать прямоугольник, нам нужно определить его форму, которая представляет собой многоугольник, состоящий из 4 точек (верхний левый, нижний левый, нижний правый, верхний правый):

Как вы могли заметить, при обработке изображений ось Y меняется на противоположную. После определения формы нам нужно нарисовать ее:

Метод рисования принимает 3 аргумента: форма, толщина линии и значения канала RGB, представленные массивом Float .

4.3. Отображение изображения

Нам нужно использовать Утилиты отображения :

5. Изображение TwelveMonkeys

Библиотека TwelveMonkeys |/ImageIO предназначена для расширения Java ImageIO API, с поддержкой большего количества форматов.

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

По умолчанию Java поддерживает только эти пять форматов изображений: JPEG , PNG , BMP , WBMP , GIF .

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

Двенадцать обезьян добавляет поддержку следующих форматов: PNG , |/PSD , TIFF , HDR , TIFF , PCX , PICT , SGI , TGA , ICNS , ICO , CUR , Thumbs.db , SVG , WMF .

Для работы с изображениями в определенном формате нам необходимо добавить соответствующую зависимость , например imageio-jpeg или imageio-tiff .

Полный список зависимостей можно найти в документации Двенадцать обезьян .

Давайте создадим пример, который читает изображение .ico . Код будет выглядеть так же, как в разделе AWT , за исключением того, что мы откроем другое изображение:

Чтобы этот пример работал, нам нужно добавить зависимость Двенадцать обезьян , которая содержит поддержку .icon images, которая является зависимостью imageio-bmp , вместе с зависимостью imageio-core :

И это все! Встроенный ImageIO Java API автоматически загружает плагины во время выполнения. Теперь наш проект будет работать и с изображениями .ico .

6. Резюме

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

Для этих целей, возможно, было бы лучше начать изучать ImageJ или OpenIMAJ. Оба они легко включаются в проект и гораздо более мощны, чем AWT, в отношении обработки изображений.

Этот урок, запущенный с объяснения использования javax.imageio пакет, чтобы загрузить изображения из внешнего формата изображения в Java 2D™'s внутренний BufferedImage формат. Затем это объясняет, как использовать Graphics.drawImage() потянуть то изображение, с дополнительной фильтрацией.

Заключительный этап сохраняет a BufferedImage объект во внешний формат изображения. Это может быть изображением, которое было первоначально загружено Image I/O class от внешнего формата изображения и возможно измененного использования Java 2-D API, или это может быть то, которое создавалось 2-D Java.

Image I/O class обеспечивает простой способ сохранить образы во множестве форматов изображения в следующем примере:

Отметьте: BufferedImage class реализует RenderedImage интерфейс.

formatName параметр выбирает формат изображения, в котором можно сохранить BufferedImage .

ImageIO.write вызовы метода код, который реализует PNG, пишущий “плагин писателя PNG”. Термин плагин используется с тех пор Image I/O расширяемо и может поддерживать широкий диапазон форматов.

Но следующие стандартные плагины формата изображения: JPEG, PNG, ДЖИФ, BMP и WBMP всегда присутствовать.

У каждого формата изображения есть свои преимущества и недостатки:

Формат Плюс Минус
ДЖИФ Поддерживает анимацию, и прозрачные пиксели Поддерживает только 256 цветов и никакую полупрозрачность
PNG Лучшая альтернатива чем ДЖИФ или JPG для высококачественного цвета изображения без потерь, поддерживает полупрозрачность Не поддерживает анимацию
JPG Большой для фотографических изображений Потеря сжатия, не хорошего для текста, снимков экрана, или любого приложения, где исходное изображение должно быть сохранено точно

Для большинства приложений достаточно использовать один из этих стандартных плагинов. Они имеют преимущество того, чтобы быть легко доступным. Image I/O class обеспечивает способ включить поддержку дополнительных форматов, которые могут использоваться, и много таких плагинов существуют. Если Вы интересуетесь тем, что форматы файлов доступны, чтобы загрузить или сохранить в Вашей системе, можно использовать getReaderFormatNames и getWriterFormatNames методы ImageIO class. Эти методы возвращают массив строк, перечисляющих все форматы, поддерживаемые в этом JRE.

Возвращенный массив имен будет включать любые дополнительные плагины, которые устанавливаются, и любое из этих имен может использоваться в качестве имени формата, чтобы выбрать писателя изображения. Следующий пример кода является простой версией полного редактирования/касания изображения программа, которая использует исправленную версию ImageDrawingApplet.java пример программы, который может использоваться следующим образом:

  • Изображение сначала загружается через ввод-вывод Изображения
  • Пользователь выбирает фильтр из выпадающего списка, и новое обновленное изображение оттягивается
  • Пользователь выбирает сохранить формат из выпадающего списка
  • Затем селектор файла появляется, и пользователь выбирает, где сохранить образ
  • Измененное изображение может теперь быть просмотрено другими настольными приложениями

Полный код этого примера представляется в SaveImage.java .

В этом уроке Вы изучили только основы Image I/O , который оказывает обширную поддержку для того, чтобы записать изображения, включая работу непосредственно с ImageWriter плагин, чтобы достигнуть более прекрасного управления процессом кодирования. ImageIO может записать повторные изображения, метаданные изображения, и определить качество по сравнению с компромиссами размера. Для получения дополнительной информации см. Руководство по API ввода-вывода Изображения Java .

Ваше использование этой страницы и всего материала на страницах под "Учебным баннером" Java подвергается этим официальным уведомлениям.

Авторское право © 1995, 2012 Oracle и/или его филиалы. Все права защищены.

Читайте также: