Меню

Bufferedimage java как изменить цвет



Компьютерная графика → Работа с изображениями в Java: чтение, запись, изменение

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

Того, что здесь будет показано вполне достаточно чтобы выполнить все лабы.

Итак, поехали.

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

Класс импортируется с пакета java.awt.image:

Для открытия изображения будем использовать два класса: File, ImageIO:

В параметра конструктора класса File, мы должны указать путь до файла. Путь может быть абсолютным, либо относитьтельно корня проекта. Можно открывать картинки с расширением jpg, png, bmp.

После этого в объекта image у нас будет храниться вся картинка, которую мы открыли. Мы можем получить у этой картинки значение любого пикселя в виде цвета в RGB. Чтобы получить цвет какого либо пикселя нам нужен класс Color:

Чтобы получить цвет из пикселя с координатами [20, 20] нужно написать:

Тут также показано как получить значение каждого канала(красный, зеленый, синий) этого цвета. Значения каналов находятся в диапазоне [0, 255].

Значения этих каналов мы будем использовать для обработки изображений. После обработки мы обычно получаем новые значения для каждого канала. Чтобы объединить три канала в один цвет, создаем новый объект класса Color:

Затем, мы можем установить этот цвет как цвет какого-либо пикселя в изображение:

После того, как мы обработали изображение, его нужно сохранить обратно в файл:

Вместо «jpg» можно использовать также «png» или «bmp».

Давайте для примера я напишу приложение, которое будет превращать исходное изображение в черно-белое, используя то, что написано в статье.

Обычно для результирующего изображения создается новый объект типа BufferedImage такого же размера и типа, как исходное изображение:

Преобразователь в черное белое

Возьмем для примера любое цветное изображение. Например:

Поместим его в корень проекта.

Запустив эту программу мы получим новую картинку в той же папке где и исходная картинка. И она должна быть такой:

Источник

Класс Java BufferedImage

Класс Java BufferedImage является подклассом класса Image. Он используется для обработки и управления данными изображения. BufferedImage сделан из ColorModel данных изображения. Все объекты BufferedImage имеют координату верхнего левого угла (0, 0).

Конструкторы

Этот класс поддерживает три типа конструкторов.

Первый конструктор создает новый BufferedImage с указанными ColorModel и Raster.

Второй конструктор создает BufferedImage одного из предопределенных типов изображений.

Третий конструктор создает BufferedImage одного из предопределенных типов изображений: TYPE_BYTE_BINARY или TYPE_BYTE_INDEXED.

copyData (WritableRaster outRaster)

Он вычисляет произвольную прямоугольную область BufferedImage и копирует ее в указанный WritableRaster.

Возвращает объект класса ColorModel изображения.

Возвращает изображение как одну большую плитку.

getData (прямоугольник прямоугольник)

Он вычисляет и возвращает произвольную область BufferedImage .

Этот метод возвращает Graphics2D, сохраняет обратную совместимость.

Возвращает высоту BufferedImage .

Возвращает минимальную координату x этого BufferedImage .

Возвращает минимальную координату y этого BufferedImage .

getRGB (int x, int y)

Возвращает целочисленный пиксель в стандартной цветовой модели RGB (TYPE_INT_ARGB) и цветовом пространстве sRGB по умолчанию.

Возвращает тип изображения.

copyData (WritableRaster outRaster)

Он вычисляет произвольную прямоугольную область BufferedImage и копирует ее в указанный WritableRaster.

Возвращает объект класса ColorModel изображения.

Возвращает изображение как одну большую плитку.

getData (прямоугольник прямоугольник)

Он вычисляет и возвращает произвольную область BufferedImage .

Этот метод возвращает Graphics2D, сохраняет обратную совместимость.

Возвращает высоту BufferedImage .

Возвращает минимальную координату x этого BufferedImage .

Возвращает минимальную координату y этого BufferedImage .

getRGB (int x, int y)

Возвращает целочисленный пиксель в стандартной цветовой модели RGB (TYPE_INT_ARGB) и цветовом пространстве sRGB по умолчанию.

Возвращает тип изображения.

пример

В следующем примере демонстрируется использование класса Java BufferedImage который рисует некоторый текст на экране, используя графический объект —

Выход

Когда вы выполняете данный код, вы увидите следующий вывод:

Источник

Иллюстрированный самоучитель по Java

Модель обработки прямым доступом

Подобно тому, как вместо класса Graphics система Java 2D использует его расширение Graphics2D, описанное в главе 9, вместо класса image в Java 2D употребляется его расширение – класс Bufferedimage. В конструкторе этого класса:

…задаются размеры изображения и способ хранения точек – одна из констант:

  • TYPE_INT_RGB TYPE_4BYTE_ABRG TYPE_USHORT_565_RGB
  • TYPE_INT_ARGB TYPE_4BYTE_ABRG_PRE TYPE_USHORT_555_RGB
  • TYPE_INT_ARGB_PRE TYPE_BYTE_GRAY TYPE_USHORT_GRAY
  • TYPE_INT_BRG TYPE_BYTE_BINARY
  • TYPE_3BYTE_BRG TYPE_BYTE_INDEXED

Как видите, каждый пиксел может занимать 4 байта – INT, 4BYTE, или 2 байта – USHORT, или 1 байт – BYTE. Может использоваться цветовая модель RGB, или добавлена альфа-составляющая – ARGB, или задан другой порядок расположения цветовых составляющих – BRG, или заданы градации серого цвета – GRAY. Каждая составляющая цвета может занимать один байт, 5 битов или 6 битов.

Экземпляры класса Bufferedimage редко создаются конструкторами. Для их создания чаще обращаются к методам createimage () класса component с простым приведением типа:

При этом экземпляр bi получает характеристики компонента: цвет фона и цвет рисования, способ хранения точек.

Расположение точек в изображении регулируется классом Raster или его подклассом WritableRaster. Эти классы задают систему координат изображения, предоставляют доступ к отдельным пикселам методами getPixel(), позволяют выделять фрагменты изображения методами getPixeis(). Класс WritableRaster дополнительно разрешает изменять отдельные пикселы методами setPixel () или целые фрагменты изображения методами setPixels () и setRect().

Начало системы координат изображения – левый верхний угол – имеет координаты (minX, minY), не обязательно равные нулю.

При создании экземпляра класса Bufferedimage автоматически формируется связанный с ним экземпляр класса WritableRaster.

Точки изображения хранятся в скрытом буффе, содержащем одномерный или двумерный массив точек. Вся работа с буфером осуществляется методами одного из классов DataBufferByte, DataBufferlnt, DataBufferShort, DataBufferushort в зависимости от длины данных.

Общие свойства этих классов собраны в их абстрактном суперклассе DataBuffer. В нем определены типы данных, хранящихся в буфере: TYPE_BYTE, TYPEJJSHORT, TYPE_INT, TYPEJJNDEFINED.

Методы класса DataBuffer предоставляют прямой доступ к данным буфера, но удобнее и безопаснее обращаться к ним методами классов Raster и WritableRaster.

При создании экземпляра класса Raster или класса WritableRaster создается экземпляр соответствующего подкласса класса DataBuffer.

Источник

Обработка изображений на Java | Установите 5 (Преобразование цветного изображения в красный, зеленый, синий)

Мы настоятельно рекомендуем ссылаться на этот пост ниже.

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

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

Преобразование в красное изображение
Алгоритм преобразования цветного изображения в красный:

  1. Получить значение RGB пикселя.
  2. Установите значения RGB следующим образом:
    • R: НЕТ ИЗМЕНЕНИЯ
    • G: установить на 0
    • B: установить на 0
  3. Замените значения R, G и B пикселя значениями, вычисленными на шаге 2.
  4. Повторите шаги с 1 по 3 для каждого пикселя изображения.

Реализация вышеуказанного алгоритма:

// Java-программа для демонстрации преобразования цветного изображения в красное

public class RedImage

public static void main(String args[]) throws IOException

BufferedImage img = null ;

f = new File( «G:\\Inp.jpg» );

catch (IOException e)

// получаем ширину и высоту

int width = img.getWidth();

int height = img.getHeight();

// преобразовать в красное изображение

for ( int y = 0 ; y

for ( int x = 0 ; x

int p = img.getRGB(x,y);

// установить новый RGB

// сохраняем значение r таким же, как в оригинале

// изображение и установка g и b как 0.

p = (a 24 ) | (r 16 ) | ( 0 8 ) | 0 ;

f = new File( «G:\\Out.jpg» );

ImageIO.write(img, «jpg» , f);

catch (IOException e)

Примечание. Этот код не будет работать в онлайн-среде IDE, поскольку для него требуется изображение на диске.
Выход:

Преобразование в зеленое изображение
Алгоритм преобразования цветного изображения в зеленый:

  1. Получить значение RGB пикселя.
  2. Установите значения RGB следующим образом:
    • R: установить на 0
    • G: без изменений
    • B: установить на 0
  3. Замените значения R, G и B пикселя значениями, вычисленными на шаге 2.
  4. Повторите шаги с 1 по 3 для каждого пикселя изображения.

Реализация вышеуказанного алгоритма:

// Java-программа для демонстрации цвета от зеленого до зеленого
// преобразование изображения

public class GreenImage

public static void main(String args[]) throws IOException

BufferedImage img = null ;

f = new File( «G:\\Inp.jpg» );

catch (IOException e)

// получаем ширину и высоту

int width = img.getWidth();

int height = img.getHeight();

// преобразовать в зеленое изображение

for ( int y = 0 ; y

for ( int x = 0 ; x

int p = img.getRGB(x,y);

// установить новый RGB

// сохраняем значение g как в оригинале

// изображение и установка r и b как 0.

p = (a 24 ) | ( 0 16 ) | (g 8 ) | 0 ;

f = new File( «G:\\Out.jpg» );

ImageIO.write(img, «jpg» , f);

catch (IOException e)

Примечание. Этот код не будет работать в онлайн-среде IDE, поскольку для него требуется изображение на диске.
Выход:

Преобразование в синее изображение
Алгоритм преобразования цветного изображения в синее:

  1. Получить значение RGB пикселя.
  2. Установите значения RGB следующим образом:
    • R: установить на 0
    • G: установить на 0
    • B: без изменений
  3. Замените значения R, G и B пикселя значениями, вычисленными на шаге 2.
  4. Повторите шаги с 1 по 3 для каждого пикселя изображения.

Реализация вышеуказанного алгоритма:

// Java-программа для демонстрации преобразования цветного изображения в синее

public class BlueImage

public static void main(String args[]) throws IOException

BufferedImage img = null ;

f = new File( «G:\\Inp.jpg» );

catch (IOException e)

// получаем ширину и высоту

int width = img.getWidth();

int height = img.getHeight();

// конвертировать в синее изображение

for ( int y = 0 ; y

for ( int x = 0 ; x

int p = img.getRGB(x,y);

// установить новый RGB

// сохраняем значение b таким же, как в оригинале

// изображение и установка r и g как 0.

p = (a 24 ) | ( 0 16 ) | ( 0 8 ) | b;

f = new File( «G:\\Out.jpg» );

ImageIO.write(img, «jpg» , f);

catch (IOException e)

Примечание. Этот код не будет работать в онлайн-среде IDE, поскольку для него требуется изображение на диске.
Выход:

Эта статья предоставлена Пратиком Агарвалом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Источник

Как заменить цвета в BufferedImage на JAVA

Мне интересно, есть ли более эффективный метод замены цветов в BufferedImage. На данный момент я использую следующий метод:

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

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

4 ответа

Я изо всех сил пытался найти и ответить на этот вопрос. Я пытаюсь изменить цвет пикселя в большом BufferedImage с imageType TYPE_BYTE_BINARY. По умолчанию, когда я создаю изображение, он создаст черное изображение, которое отлично, но я не могу изменить цвет пикселя на белый. Это основная идея.

Мне нужен способ определить тип этого BufferedImage в java (Binary, Gray, 24 bit color, 8 bit color) ? Это что-то вроде метода BufferedImage.getType() ,который возвращает целое число ,которое определяет это, но мне нужен способ справиться с этим. И если есть алгоритм, который обнаруживает его, как.

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

Используйте HashMap . Ключ должен быть оригинального цвета,а значение замены. Если get возвращает null, ничего не делайте.

Похоже, что идиоматический способ сделать это-реализовать LookupOp , а затем применить эту операцию для создания нового целевого объекта BufferedImage . Здесь есть отличный ответ .

Я сохранил изображение RGB в BufferedImage, то, что я хочу сделать, это взять каждый цвет (например, красный) и сохранить его в новом BufferedImage. Таким образом, в конце концов, у меня будет четыре BufferedImage, оригинальный и один для каждого цвета. Каждый BufferedImage для каждого цвета.

Я пытаюсь скопировать цвета из BufferedImage в другой bufferedImage, и ниже приведен мой код. Я знаю, что могу использовать graphics.drawImage, но мне нужно изменить определенные цвета, и именно поэтому я копирую цвета пиксель за пикселем вместо того, чтобы просто рисовать изображение поверх.

Взгляните на BufferedImageFilter / BufferedImageOp , чтобы отфильтровать свое изображение в парадигме producer/consumer/observer.

Похожие вопросы:

Каков наилучший и/или самый простой способ заменить отсутствующую функциональность BufferedImage для проекта Java, который я преобразую в .NET с помощью IKVM? Я в основном получаю исключения .

Что представляют собой параметры x и y в методе getRGB(x, y)? Что представляет собой числовое возвращаемое значение? Как я могу определить цвет определенных пикселей в пределах BufferedImage.

Так что у меня есть файл с изображением вулкана на нем. Все остальное — 0xFFFF00FF (непрозрачный пурпурный). Я хочу заменить каждый пиксель, содержащий этот цвет, на 0 (прозрачный). Пока что мой.

Я изо всех сил пытался найти и ответить на этот вопрос. Я пытаюсь изменить цвет пикселя в большом BufferedImage с imageType TYPE_BYTE_BINARY. По умолчанию, когда я создаю изображение, он создаст.

Мне нужен способ определить тип этого BufferedImage в java (Binary, Gray, 24 bit color, 8 bit color) ? Это что-то вроде метода BufferedImage.getType() ,который возвращает целое число ,которое.

Я сохранил изображение RGB в BufferedImage, то, что я хочу сделать, это взять каждый цвет (например, красный) и сохранить его в новом BufferedImage. Таким образом, в конце концов, у меня будет.

Я пытаюсь скопировать цвета из BufferedImage в другой bufferedImage, и ниже приведен мой код. Я знаю, что могу использовать graphics.drawImage, но мне нужно изменить определенные цвета, и именно.

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

Я пытаюсь написать программу, которая принимает bufferedImage в качестве входных данных и отображает все черные близкие цвета (R<32, G<32, B<32) в черный, а остальные в белый для целей OCR.

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

Источник

Читайте также:  Как раскрасить разделочную доску цветами

Слово "Цвет" и его описание © 2021
Внимание! Информация, опубликованная на сайте, носит исключительно ознакомительный характер и не является рекомендацией к применению. Обязательно проконсультируйтесь с вашим лечащим врачом!

Sr.No Метод и описание
1